• 2017.2.7 开涛shiro教程-第六章-Realm及相关对象(三)


    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398

    根据下载的pdf学习。

    第六章 Realm及相关对象(三)

    1.准备3个Realm

    MyRealm1,MyRealm2,MyRealm3。

    (1)MyRealm1

    public class MyRealm1 implements Realm {
    
        @Override
        public String getName() {
            return "a"; //realm name 为 “a”
        }
    
        @Override
        public boolean supports(AuthenticationToken token) {
            return token instanceof UsernamePasswordToken;
        }
    
        @Override
        public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            return new SimpleAuthenticationInfo(
                    "zhang", //身份 字符串类型
                    "123",   //凭据
                    getName() //Realm Name
            );
        }
    }

    (2)MyRealm2

    和Realm1的代码一样,只是getName返回的是“b”。

    (3)MyRealm3

    MyRealm3的名字是c,并且返回的信息中,参看代码第17行,是User类型的身份

     1 public class MyRealm3 implements Realm {
     2 
     3     @Override
     4     public String getName() {
     5         return "c"; //realm name 为 “c”
     6     }
     7 
     8     @Override
     9     public boolean supports(AuthenticationToken token) {
    10         return token instanceof UsernamePasswordToken;
    11     }
    12 
    13     @Override
    14     public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    15         User user = new User("zhang", "123");
    16         return new SimpleAuthenticationInfo(
    17                 user, //身份 User类型
    18                 "123",   //凭据
    19                 getName() //Realm Name
    20         );
    21     }
    22 }

    2.ini配置

    3.测试用例

     1 public class PrincialCollectionTest extends BaseTest {
     2 
     3     @Test
     4     public void test() {
     5 
     6         //每个Realm都身份验证成功了
     7         login("classpath:shiro-multirealm.ini", "zhang", "123");
     8         Subject subject = subject();
     9         //获取Primary Principal(即第一个)
    10         Object primaryPrincipal1 = subject.getPrincipal();
    11         PrincipalCollection princialCollection = subject.getPrincipals();
    12         Object primaryPrincipal2 = princialCollection.getPrimaryPrincipal();
    13 
    14         //但是因为多个Realm都返回了Principal,所以此处到底是哪个是不确定的
    15         Assert.assertEquals(primaryPrincipal1, primaryPrincipal2);
    16 
    17 
    18         //返回 a b c
    19         Set<String> realmNames = princialCollection.getRealmNames();
    20         System.out.println(realmNames);
    21 
    22         //因为MyRealm1和MyRealm2返回的凭据都是zhang,所以排重了
    23         Set<Object> principals = princialCollection.asSet(); //asList和asSet的结果一样
    24         System.out.println(principals);
    25 
    26         //根据Realm名字获取,由于多个Realm可以重名,所以使用时可能返回多个身份。防止这种情况,就是尽量不要重名。
    27         Collection<User> users = princialCollection.fromRealm("c");
    28         System.out.println(users);
    29     }
    30 }
  • 相关阅读:
    Unity调试模式设置辅助线是否可见
    Gizmos绘制塔防游戏网格
    JS offsetparent 问题
    JS 图像延迟加载
    JS image对象
    JS 瀑布流
    JS 对象
    JS node
    Vue+element 实现表格的增加行、根据索引删除行的功能
    Java的集合框架
  • 原文地址:https://www.cnblogs.com/lyh421/p/6378764.html
Copyright © 2020-2023  润新知