Apache Shiro 学习记录2

  写完上篇随笔以后(链接).....我也想自己尝试一下写一个Strategy.....Shiro自带了3个Strategy,教程(链接)里作者也给了2个.....我想写个都不一样的策略.....看来看去....决定写个LastSuccessfulStrategy好了...顾名思义就是返回最后一个Realm验证成功的AuthenticationInfo的信息...

 1 package com.github.zhangkaitao.shiro.chapter2.authenticator.strategy;
 2
 3 import org.apache.shiro.authc.AuthenticationException;
 4 import org.apache.shiro.authc.AuthenticationInfo;
 5 import org.apache.shiro.authc.AuthenticationToken;
 6 import org.apache.shiro.authc.pam.AbstractAuthenticationStrategy;
 7 import org.apache.shiro.realm.Realm;
 8 import org.apache.shiro.util.CollectionUtils;
 9
10 public class LastSuccessfulStrategy extends AbstractAuthenticationStrategy {
11     @Override
12     protected AuthenticationInfo merge(AuthenticationInfo info,
13             AuthenticationInfo aggregate) {
14         // TODO Auto-generated method stub
15         if (info != null && !CollectionUtils.isEmpty(info.getPrincipals()))
16             return info;
17         else
18             return aggregate;
19     }
20
21     @Override
22     public AuthenticationInfo afterAttempt(Realm realm,
23             AuthenticationToken token, AuthenticationInfo singleRealmInfo,
24             AuthenticationInfo aggregateInfo, Throwable t)
25             throws AuthenticationException {
26         // TODO Auto-generated method stub
27         return merge(singleRealmInfo, aggregateInfo);
28     }
29
30     @Override
31     public AuthenticationInfo afterAllAttempts(AuthenticationToken token, AuthenticationInfo aggregate) throws AuthenticationException {
32         //we know if one or more were able to succesfully authenticate if the aggregated account object does not
33         //contain null or empty data:
34         if (aggregate == null || CollectionUtils.isEmpty(aggregate.getPrincipals())) {
35             throw new AuthenticationException("Authentication token of type [" + token.getClass() + "] " +
36                     "could not be authenticated by any configured realms.  Please ensure that at least one realm can " +
37                     "authenticate these tokens.");
38         }
39
40         return aggregate;
41     }
42 }

我的想法是这样的...只要Realm返回的info不为空,就把它作为aggregate储存起来...否则直接返回aggregate....所以我override了merge方法...并在afterAttemp里调用它....

然后所有Realm都处理完毕以后..如果aggregate是null...说明所有Realm都验证失败了...那么应该抛出异常....这里逻辑我就直接抄AtLeastOneSuccessfulStrategy类的代码了...

测试代码直接修改教程的就行了

 1     @Test
 2     public void testHelloworld2() {
 3         // 1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
 4         Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory(
 5                 "classpath:shiro2.ini");
 6
 7         // 2、得到SecurityManager实例 并绑定给SecurityUtils
 8         org.apache.shiro.mgt.SecurityManager securityManager = factory
 9                 .getInstance();
10         SecurityUtils.setSecurityManager(securityManager);
11
12         // 3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
13         Subject subject = SecurityUtils.getSubject();
14         UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
15
16         try {
17             // 4、登录,即身份验证
18             subject.login(token);
19         }
20         catch (AuthenticationException e) {
21             // 5、身份验证失败
22         }
23
24         Assert.assertEquals(true, subject.isAuthenticated()); // 断言用户已经登录
25         System.out.println(subject.getPrincipal());
26
27         // 6、退出
28         subject.logout();
29     }

shiro2.ini也修改自教程

 1 [main]
 2 #指定securityManager的authenticator实现
 3 authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
 4 securityManager.authenticator=$authenticator
 5
 6 #指定securityManager.authenticator的authenticationStrategy
 7 lastSuccessfulStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
 8 securityManager.authenticator.authenticationStrategy=$lastSuccessfulStrategy
 9
10 myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1
11 myRealm2=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm2
12 myRealm3=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm3
13 securityManager.realms=$myRealm1,$myRealm3,$myRealm2

3个Realm我就不贴了...和教程是一样的....

这样我自己的LastSuccessfulStrategy策略就完成啦O(∩_∩)O哈!

时间: 2024-10-08 19:45:33

Apache Shiro 学习记录2的相关文章

Apache Shiro 学习记录5

本来这篇文章是想写从Factory加载ini配置到生成securityManager的过程的....但是貌似涉及的东西有点多...我学的又比较慢...很多类都来不及研究,我又怕等我后面的研究了前面的都忘记了...所以就先与大家分享一下我对Shiro里Ini这个类的研究. 简介 我感觉其实利用ini来配置shiro在实际应用中应该不是很多,我想大部分java应用还是web类型的,数据也应该储存在数据库里..不会简简单单的存在.ini这样的配置文件中的...但是对于学习Shiro来说,我觉得研究一下

Apache Shiro 学习记录4

今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了....而这些地方又是蛮难的..比如3.5节Authorizer.PermissionResolver及RolePermissionResolver...可能作者觉得讲清楚要花太多的篇幅涉及太多的类吧.....但是我看起来就很不爽0.0....既然提到了就想弄明白.....不然太纠结了....所以就有了这篇

Apache Shiro 学习记录3

晚上看了教程的第三章....感觉Shiro字符串权限很好用....但是教程举的例子太少了.....而且有些地方讲的不是很清楚....所以我也自己测试了一下....记录一下测试的结果.... (1) *:view 这种类型的字符串权限可以匹配user:view,qwer:view这样的,但是不能匹配qwe:qwe:view这样的... 就是说开头的*不能匹配带冒号的字符串 (2)user:* 可以匹配user:view也可以匹配user:view:qwe 当然也可以匹配user:view:qwe:

Apache Shiro学习笔记(六)FilterChain

鲁春利的工作笔记,好记性不如烂笔头 Apache Shiro学习笔记(七)IniWebEnvironment

Apache Shiro学习笔记(九)Spring集成

鲁春利的工作笔记,好记性不如烂笔头 Integrating Apache Shiro into Spring-based Applications Shiro 的组件都是JavaBean/POJO 式的组件,所以非常容易使用Spring进行组件管理,可以非常方便的从ini配置迁移到Spring进行管理,且支持JavaSE应用及Web 应用的集成. Web Applications 1.web.xml <!-- The filter-name matches name of a 'shiroFil

Apache Shiro学习笔记(五)Web集成扩展

鲁春利的工作笔记,好记性不如烂笔头 http://shiro.apache.org/web-features.html 基于Basic的拦截器身份验证 shiro-authc-basic.ini # 基于Basic的拦截器身份验证 [main] # 默认是/login.jsp authc.loginUrl=/login authcBasic.applicationName=请登录 [users] # 用户名=密码,角色 lucl=123456,admin wang=123456 [roles]

Apache Shiro学习笔记(五)Web集成使用JdbcRealm

鲁春利的工作笔记,好记性不如烂笔头 http://shiro.apache.org/web-features.html 前面的示例都是把用户名或密码以及权限信息放在ini文件中,但实际的Web项目开发过程中,实际上一般是user<--->role.role<-->permission进行关联关系的配置,每次登录时加载其拥有的权限或者是每次访问时再判断其权限. jdbc-shiro.ini [main] #默认是/login.jsp authc.loginUrl=/login rol

Apache Shiro学习笔记

鲁春利的工作笔记,好记性不如烂笔头 官网地址:http://shiro.apache.org/ 主要功能包括: Authentication:身份认证/登录,验证用户是不是拥有相应的身份:Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限:即判断用户是否能做事情:常见的如:验证某个用户是否拥有某个角色. Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中:会话可以是普通JavaSE环境的,也可以是如Web环境

Apache Shiro学习笔记(三)用户授权自定义Permission

鲁春利的工作笔记,好记性不如烂笔头 Shiro配置文件(shiro-customize-permission.ini) [main] myRealmA=com.invicme.apps.shiro.permission.MyRealmOne myPermissionResolver=com.invicme.apps.shiro.permission.MyPermissionResolver securityManager.authorizer.permissionResolver = $myPe