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 }
原文地址:https://www.cnblogs.com/lyh421/p/6378764.html