设为首页 收藏本站
查看: 536|回复: 0

[经验分享] Apache Shiro 会话与主体状态的关系

[复制链接]

尚未签到

发表于 2017-1-12 08:31:48 | 显示全部楼层 |阅读模式
  有状态的应用程序
  默认情况下ShiroSecurityManager实例会使用一个SubjectSession存储Subject的身份IDPrincipalCollection)和验证状态(subject.isAuthenticated())。这通常发生在一个Subject登录后或当一个Subject的身份ID通过Remember服务后。
  使用这种默认方式的好处是:
  l任何应用都可通过SessionID来关联请求/调用/消息,并且这是关联用户所必需的。例如,使用Subject.Builder来获取相关的Subject
  SerializablesessionId=//getfromtheinboundrequestorremotemethodinvocationpayload
  SubjectrequestSubject=newSubject.Builder().sessionId(sessionId).buildSubject();
  l任何"RememberMe"身份能够在第一次访问时就能持久化到会话的初始请求。这确保了Subject被记住的身份可以跨请求保存而不需要反序列化及将它解释到每个请求。例如,在一个Web应用程序中,没有必要去读取每一个请求的加密RememberMeCookie,如果该身份在会话中是已知的。这可是一个很好的性能提升。
  无状态的应用程序
  虽然上述的默认策略对于大多数应用程序而言是很好的(通常是可取的),但这对于无状态的应用程序来说是不合适的。许多无状态的架构规定在请求中不能存在持久状态,这种情况下的Sessions不会被允许(一个会话其本质代表了持久状态)。
  但这一要求带来一个便利的代价——Subject状态不能跨请求保留。这意味着有这一要求的应用程序必须确保Subject状态可以在每一个请求中以其他的方式代表。
  这几乎总是通过验证每个由应用程序处理的请求/调用/消息来完成的。例如,大多数无状态Web应用程序通常支持这一点通过执行HTTP基本验证,允许浏览器验证每一个代表最终用户的请求。远程或消息框架必须确保Subject的身份和凭证连接到每一个调用或消息的有效载荷,通常是由框架代码执行。
  在无状态应用中需要禁用将Subject状态持久化到会话,可通过如下配置实现:
  [main]
  …
  securityManager.subjectDAO.sessionStorageEvaluator.sessionStorageEnabled=false
  需要注意的是,禁用使用Sessions作为存储策略的实现,但它没有完全地禁用Sessions。如果你的任何代码显式地调用subject.getSession()subject.getSession(true),一个session仍然会被创建。
  混合方法
  但,如果你想使用混合的方法呢?如果某些对象应该有会话而某些没有?这种混合法方法能够给许多应用程序带来好处。例如:
  l也许humanSubject(如Web浏览器用户)由于上面提供的好处能够使用Session
  l也许non-humanSubject(如API客户端或第三方应用程序)不应该创建session由于它们与软件的交互可能会间歇或不稳定。
  l也许所有某种确定类型的Subject或从某一确定位置访问系统的应该将状态保持在会话中,但所有其他的不应该。
  如果你需要这个混合方法,你可以实现一个SessionStorageEvaluator接口,告诉Shiro哪个Subject支持会话存储。
  该接口只有一个方法:
  publicinterfaceSessionStorageEvaluator{
  publicbooleanisSessionStorageEnabled(Subjectsubject);
  }
  例如,在Web应用程序中,如果该决定必须基于当前ServletRequest中的数据,你可以获取该request或该response,因为运行时的Subjce实例实际上就是一个WebSubject实例:
  publicbooleanisSessionStorageEnabled(Subjectsubject){
  booleanenabled=false;
  if(WebUtils.isWeb(Subject)){
  HttpServletRequestrequest=WebUtils.getHttpRequest(subject);
  //set'enabled'basedonthecurrentrequest.
  }else{
  //notawebrequest-maybeaRMIordaemoninvocation?
  //set'enabled'anotherway…
  }
  returnenabled;
  }
  在你实现了SessionStorageEvaluator接口后,你可以在shiro.ini中配置它:
  [main]
  …
  sessionStorageEvaluator=com.mycompany.shiro.subject.mgt.MySessionStorageEvaluator
  securityManager.subjectDAO.sessionStorageEvaluator=$sessionStorageEvaluator
  ...
  WEB应用
  通常Web应用程序希望在每一个请求的基础上容易地启用或禁用会话的创建,不管是哪个Subject正在执行请求。这经常在支持RESTMessaging/RMI构架上使用来产生很好的效果。例如,也许正常的终端用户(使用浏览器的人)被允许创建和使用会话,但远程的API客户端使用RESTSOAP,不该拥有会话(因为它们在每一个请求上验证,常见REST/SOAP体系结构)。
  为了支持这种hybrid/per-request的能力,noSessionCreation过滤器被添加到Shiro的默认为Web应用程序启用的“池”。该过滤器将会阻止在请求期间创建新的会话来保证无状态的体验。在shiro.ini[urls]项中,你通常定义该过滤器在所有其它过滤器之前来确保会话永远不会被使用。
  例如:
  [urls]
  …
  /rest/**=noSessionCreation,authcBasic,...
  这个过滤器允许现有会话的任何会话操作,但不允许在过滤的请求创建新的会话。也就是说,一个请求或没有会话存在的Subject调用下面四个方法中的任何一个时,将会自动地触发一个DisabledSessionException异常:
  lhttpServletRequest.getSession()
  lhttpServletRequest.getSession(true)
  lsubject.getSession()
  lsubject.getSession(true)
  如果一个Subject在访问noSessionCreation-protected-URL之前已经有一个会话,则上述的四种调用仍然会如预期般工作。
  最后,在所有情况下,下面的调用将始终被允许:
  lhttpServletRequest.getSession(false)
  l subject.getSession(false)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-327222-1-1.html 上篇帖子: 使用apache poi 3.6导入excel遇到的问题。 下篇帖子: Apache Tomcat(二)Web应用:Servlet、JSP及其他
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表