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

本文介绍了使用Apache Shiro框架进行多Realm身份认证的过程。包括三个不同配置的Realm(MyRealm1、MyRealm2和MyRealm3),并展示了如何通过配置文件实现用户的登录验证。此外,还提供了一个测试案例来验证不同Realm间的认证结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原博客地址: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值