• Shiro之多Realm的认证及认证策略-yellowcong


    多重认证是操作的是多个Realm。第一种方式是,在ModularRealmAuthenticator里面可以配置多个Reamls,默认的验证策略是,至少一个满足即可(AtLeastOneSuccessfulStrategy)。建议将多Realm配置在DefaultWebSecurityManager ,将验证策略和Reaml分开来管理,也就是下面,多重认证的第二种方式

    源码下载地址

    https://gitee.com/yellowcong/shior-dmeo/tree/master/test

    多重认证

    多重认证,主要的类是ModularRealmAuthenticator,他有两个需要配置的属性,一个是Collection(用于存储Realm),另一个是AuthenticationStrategy(用于存储验证的策略 )
    这里写图片描述

    第一种方式:配置在ModularRealmAuthenticator

    下面这段代码中,我配置了两个Reamls,第一个使用的是MD5码表,第二个是 SHA1的加密,验证的策略是两个都必须满足才可以让你登录

     
          
            
              
    
                    
            
          
    
        
        
            
                
            
            
            
                
                    
                    
                    
                
            
        
    
        
        
    
            
            
            
                
                    
                    
                    
                    
                
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    第二种方式:配置在DefaultWebSecurityManager

    建议这一种策略,因为这种将授权策略和资源Realm分开了

    
          
            
              
    
                    
            
    
            
            
                
                    
                    
                    
                
            
          
    
        
        
            
                
            
        
    
        
        
    
            
            
            
                
                    
                    
                    
                    
                
            
        
    
    
        
        
    
            
            
            
                
                    
                    
                    
                    
                
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    验证策略

    在ModularRealmAuthenticator 中,多重验证中,默认的验证策略是AtLeastOneSuccessfulStrategy

    策略

    意义

    AllSuccessfulStrategy

    所有都满足的情况

    AtLeastOneSuccessfulStrategy

    至少一条满足的情况

    FirstSuccessfulStrategy

    第一条满足的情况

    这里写图片描述

    代码

    下面这两个验证器没啥太大差别,就是加盐和 加密方式不一样,在实际项目中,可能设置多个密钥,进行多重验证

    项目结构

    这里写图片描述

    spring-shiro.xml

    
    
        == Shiro Components ==
    
        
        
    
        
          
            
              
    
                    
            
    
            
            
                
                    
                    
                    
                
            
          
    
        
        
            
                
            
        
    
        
        
    
            
            
            
                
                    
                    
                    
                    
                
            
        
    
    
        
        
    
            
            
            
                
                    
                    
                    
                    
                
            
        
    
        
          
    
        
          
             
           
             
           
             
           
             
             
                 
                    
                   /user/list = authc 
                   /user/error =  anon
                   /users/user/login = anon
                    
                   /resources/img/** = anon  
                   /resources/js/** = anon  
                 
             
        
    
       
       
    
          
          
              
          
    
          
              
          
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111

    SampleRealm.java

    package com.yellowcong.shior.realm;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.annotation.Resource;
    
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authc.UnknownAccountException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.util.ByteSource;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.yellowcong.model.User;
    import com.yellowcong.service.UserService;
    
    /**
     * 创建日期:2017年9月23日 
    * 创建用户:yellowcong
    * 功能描述:用于授权操作 */ public class SampleRealm extends AuthorizingRealm { private UserService userService; @Resource(name="userService") public void setUserService(UserService userService) { this.userService = userService; } /** * 用户授权,当用户访问需要有权限的页面的情况,需要访问这个方法来获取权限列表 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection paramPrincipalCollection) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 根据用户ID查询角色(role),放入到Authorization里。 Set roles = new HashSet(); // 添加用户角色 roles.add("administrator"); info.setRoles(roles); // 根据用户ID查询权限(permission),放入到Authorization里。 Set permissions = new HashSet(); // 添加权限 permissions.add("/role/**"); info.setStringPermissions(permissions); return info; } /** * 认证,用户登录 * 登陆的时候,会调用这个 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken paramAuthenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) paramAuthenticationToken; //数据库中,查询用户的信息 User user = userService.login(token.getUsername()); // token返回的是一个数组,将char类型转化为String类型 //这个是web前台传递过来的值 //这个密码的比对是通过Shiro自己给我们完成的 //密码是通过AuthenticatingRealm.getCredentialsMatcher 的方式来进行比对的 String pswDate = new String(token.getPassword()); //当用户为空的情况 if(user == null){ // 当没有用户的时候,抛出异常 throw new UnknownAccountException(); } //第一个参数:用户名/用户对象 String username =token.getUsername(); //第二个参数:用户的密码 String password = user.getPassword(); //第三个参数:盐值(这个盐是 username) ByteSource solt = ByteSource.Util.bytes(username); //第四个参数:获取这个Realm的信息 String realmName =this.getName(); //他们拿到密码web的密码,同数据库获取到的密码进行比对操作 return new SimpleAuthenticationInfo(username, password, solt,realmName); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    SampleRealm2.java

    package com.yellowcong.shior.realm;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.annotation.Resource;
    
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authc.UnknownAccountException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.util.ByteSource;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.yellowcong.model.User;
    import com.yellowcong.service.UserService;
    
    /**
     * 创建日期:2017年9月23日 
    * 创建用户:yellowcong
    * 功能描述:用于授权操作 */ public class SampleRealm2 extends AuthorizingRealm { private UserService userService; @Resource(name="userService") public void setUserService(UserService userService) { this.userService = userService; } /** * 用户授权,当用户访问需要有权限的页面的情况,需要访问这个方法来获取权限列表 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection paramPrincipalCollection) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 根据用户ID查询角色(role),放入到Authorization里。 Set roles = new HashSet(); // 添加用户角色 roles.add("administrator"); info.setRoles(roles); // 根据用户ID查询权限(permission),放入到Authorization里。 Set permissions = new HashSet(); // 添加权限 permissions.add("/role/**"); info.setStringPermissions(permissions); return info; } /** * 认证,用户登录 * 登陆的时候,会调用这个 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken paramAuthenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) paramAuthenticationToken; //数据库中,查询用户的信息 User user = userService.login(token.getUsername()); // token返回的是一个数组,将char类型转化为String类型 //这个是web前台传递过来的值 //这个密码的比对是通过Shiro自己给我们完成的 //密码是通过AuthenticatingRealm.getCredentialsMatcher 的方式来进行比对的 String pswDate = new String(token.getPassword()); //当用户为空的情况 if(user == null){ // 当没有用户的时候,抛出异常 throw new UnknownAccountException(); } //第一个参数:用户名/用户对象 String username =token.getUsername(); //第二个参数:用户的密码 String password = user.getPassword(); //第三个参数:盐值(这个盐是 username) ByteSource solt =null; //第四个参数:获取这个Realm的信息 String realmName =this.getName(); //他们拿到密码web的密码,同数据库获取到的密码进行比对操作 return new SimpleAuthenticationInfo(username, password, solt,realmName); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
  • 相关阅读:
    mannose-CHO|甘露糖-醛基|甘露糖-聚乙二醇-醛基|醛基-PEG-甘露糖
    BokehMe: When Neural Rendering Meets Classical Rendering
    机器学习基础了解
    YoloV8改进策略:LSKNet加入到YoloV8中,打造更适合小目标的YoloV8
    手机怎么实现图片转文字操作?学会这三招就够了
    PDF标准详解(三)—— PDF坐标系统和坐标变换
    VMware Aria Operations for Networks 6.8 - 网络和应用监控工具
    5、MySQL——修改表结构、DQL(查询操作)、条件查询
    Kafka集群搭建
    【Java基础】程序流程控制
  • 原文地址:https://blog.csdn.net/m0_67392010/article/details/126496240