Subject 认证主体
Subject认证主体包含两个信息
- Principals : 身份,可以是用户名、邮箱、手机号等,用来标识一个登录主体身份。
- Credentials : 凭证,常见有密码,数字证书。
Realm
Realm 意思是域,Shiro 从 Realm 中获取验证数据。
Realm 有很多种类,常见的有 jdbc realm , jndi realm , text realm
重点看下jdbc realm的使用。
- 新建数据库 db_shiro
- 新建 users 表,表名只能是 users
- users 中有三个字段,id , userName , password ,名称固定。
- 新建 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/db_shiro dataSource.user=root dataSource.password=123qwe jdbcRealm.dataSource=$dataSource securityManager.realms=$jdbcRealm
securityManager.realms :设置realms,可以有多个,用逗号隔开
- 新建测试类,代码如下:
package com.zhen.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("zhen", "123"); try { //身份认证 currentUser.login(token); System.out.println("身份认证成功!"); } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("身份认证失败!"); } //退出 currentUser.logout(); } }