shiro认证

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 测试

同上一样


赏一赏