场景
Subject认证主体
Subject认证主体包含两个信息:
1.Principals:身份,可以是用户名,邮件,手机号码等,可以用来标识一个登录主体身份。
2.Credentials:凭证,常见有密码,数字证书等。
身份认证流程
Realm以及JDBC Realm
Realm意思是域,shiro从Realm中获取验证数据。
Realm有很多种,例如常见的jdbc realm、jndi realm、text realm。
jdbc realm:Shiro 提供了一个 JdbcRealm,它会默认去寻找 users, roles, permissions 三张表做类似于 DAO 中的查询。
实现
搭建数据库以及表
新建users表
插入users表数据
建表符合如上规范,shiro就会自动查询users表进行身份验证。
新建配置文件
resource下新建jdbc_realm.ini文件
[main]
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shirotest
dataSource.user=root
dataSource.password=123
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm
注:
1.jdbcRealm是固定写。
2.dataSource设置数据源。
3.jdbcRealm.dataSource=$dataSource是使用上面刚声明的dataSource数据源。
进行身份验证
新建类JdbcRealmTest.java
package com.badao.shiro;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class JdbcRealmTest {
public static void main(String[] args) {
//读取配置文件,初始化化SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbc_realm.ini");
//获取securityManager实例
SecurityManager securityManager = factory.getInstance();
//将securityManager实例绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
//获取当前用户
Subject currentUser = SecurityUtils.getSubject();
//创建token令牌,用户名 密码
UsernamePasswordToken token = new UsernamePasswordToken("badao","12");
try {
//身份认证 登录
currentUser.login(token);
System.out.println("身份认证成功");
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("身份认证失败");
}
//退出
currentUser.logout();
}
}
效果
输入错误
输入正确
标签:jdbc,import,org,Shiro,dataSource,查询数据库,apache,JdbcRealm,shiro From: https://blog.51cto.com/BADAOLIUMANGQZ/6147500