Shiro身份验证——使用指定的验证Realm
1.Subject认证主体
Subject认证 包含两个信息:
Principals:身份,可以是用户名,邮件,手机号码等等,用来标识一个登录主体身份;
Credentials:凭证,常见有密码,数字证书等等;
2.身份认证流程
3.Realm&JdbcRealm
Realm:域,Shiro从Realm中获取验证数据;
Realm有很多种类,例如常见的JdbcRealm,JndiRealm,TextRealm;
这里我们使用JdbcRealm。
首先,创建数据库和表:
添加druid,mysql 驱动依赖坐标:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.26</version>
</dependency>
在resources目录下创建jdbc_realm.ini配置文件
[main]
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
dataSource=com.alibaba.druid.pool.DruidDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/mydb2?useUnicode=true&characterEncoding=gbk
dataSource.username=root
dataSource.password=root
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm
创建测试类ShiroTest
import org.apache.shiro.SecurityUtils;
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 ShiroTest2 {
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 subject = SecurityUtils.getSubject();
//创建token令牌,用户名/密码
UsernamePasswordToken token = new UsernamePasswordToken("admin","123");
try{
//身份验证
subject.login(token);
System.out.println("身份登录成功 ");
}catch(Exception e){
e.printStackTrace();
System.out.println("身份登录失败");
}
//退出
subject.logout();
}
}
测试结果