shiro 认证
1 基本概念
1.1 身份验证
即在应用中谁能证明他就是他本人。一般提供如他们的身份 ID 一些标识信息来 表明他就是他本人,如提供身份证,用户名/密码来证明。 在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能 验证用户身份:
1.2 principals
身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。 一个主体可以有多个 principals,但只有一个 Primaryprincipals,一般是用户名/密码/手机号。
1.3 credentials
证明/凭证,即只有主体知道的安全值,如密码/数字证书等。 最常见的 principals 和 credentials 组合就是用户名/密码了。接下来先进行一个基本的身 份认证。
2 认证流程
3 入门程序(用户登陆和退出)
3.1 创建 java 工程
3.2 加入相关 jar 包
commons-beanutils-1.9.2.jar commons-logging-1.2.jar unit-4.10.jar shiro-all-1.2.3.jar slf4j-api-1.7.7.jar log4j-1.2.17.jar slf4j-log4j12-1.7.5.jar
3.3 log4j.properties 日志配置文件
log4j.rootLogger=debug, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
3.4 配置 shiro 环境文件 shiro.ini
通过 Shiro.ini 配置文件初始化 SecurityManager 环境。
[users] zhangsan=1111 lisi=1111
3.5 代码实现
//用户登录和退出 @Test public void testAuthenticator(){ // 构建 SecurityManager 工厂,IniSecurityManagerFactory 可以 从 ini 文件中初始化 SecurityManager 环境 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); //通过工厂获得 SecurityManager 实例 SecurityManager securityManager = factory.getInstance(); //将 securityManager 设置到运行环境中 SecurityUtils.setSecurityManager(securityManager); //获取 subject 实例 Subject subject = SecurityUtils.getSubject(); //创建用户名,密码身份验证 Token UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "1111"); try { //登录,即身份验证 subject.login(token); } catch (AuthenticationException e) { e.printStackTrace(); //身份认证失败 } //断言用户已经登录 Assert.assertEquals(true, subject.isAuthenticated()); //退出 subject.logout(); }
1.4.6 sessionManager
4 自定义 Realm
Shiro 默认使用自带的 IniRealm,IniRealm 从 ini 配置文件中读取用户的信息,大部分情 况下需要从系统的数据库中读取用户信息,所以需要自定义 realm。
4.1Realm 接口
最基础的是 Realm 接口,CachingRealm 负责缓存处理,AuthenticationRealm 负责认证, AuthorizingRealm 负责授权,通常自定义的 realm 继承 AuthorizingRealm。4.2 自定义 Realm 实现
/** *自定义 *Realm 实现 *@author 邹波 *@version 1.0 *@date 2016-1-21 */ public class UserRealm extends AuthorizingRealm { @Override public String getName() { return "UserRealm"; } //用于认证 @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException { //从 token 中获取身份信息 String username = (String)token.getPrincipal(); //根据用户名到数据库中取出用户信息 如果查询不到 返回 null String password = "1111"; //假如从数据库中获取密码为 1111 //返回认证信息 SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(username, password, this.getName()); return simpleAuthenticationInfo; } //用于授权 @Override protected AuthorizationInfo doGetAuthorizationInfo( PrincipalCollection principals) { return null; } }
4.3 配置 Realm
需要在 shiro.ini 配置 realm 注入到 securityManager 中。
[main] #自定义 realm userRealm=cn.siggy.realm.UserRealm #将 realm 设置到 securityManager securityManager.realms=$userRealm
4.4 测试
同上一样