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 }
fighting for this