Shiro 和 Tomcat AccessLogValve
Posted
技术标签:
【中文标题】Shiro 和 Tomcat AccessLogValve【英文标题】:Shiro and Tomcat AccessLogValve 【发布时间】:2012-11-01 15:01:08 【问题描述】:我使用Shiro
(v1.2.1) 作为安全框架,它运行良好,但是在Tomcat
(v7.0.32) 的访问日志中,当经过身份验证的用户访问任何资源时,您无法让远程用户登录。对于我的示例 Web 应用程序,我使用了 Shiro
SVN 示例 repo 中提供的默认配置。
127.0.0.1 - - [13/Nov/2012:08:22:55 +0200] "POST /pacs/login.jsp HTTP/1.1" 302 - // User here not logged
127.0.0.1 - - [13/Nov/2012:08:22:55 +0200] "GET /pacs/ HTTP/1.1" 200 821 // Here user is accessing protected page, so we got permission.
有什么办法可以解决吗?
【问题讨论】:
【参考方案1】:我不确定这是否是官方解决方案,但它是一个适合我的解决方案:
对于 AccessLogValve 模式,使用
%u - Remote user that was authenticated (if any), else '-'
这将打印“猜测的用户名”。如果你问谷歌tomcat是如何猜测用户名的,你会发现这样的:
For the user name, the manager uses the Session.getPrincipal() if available;
if not, it tries the following Session attribute names:
Login
User
userName
UserName
Utilisateur
using the given case, lower case, and upper case. Failing that, it searches for
attributes that are instances of java.security.Principal or
javax.security.auth.Subject.
就我而言,我只是修改了登录代码以将用户对象写入会话。 Tomcat 将在该对象上调用 .toString() 以打印“猜测的用户名”。
如果 .toString() 的结果不是你想要的,你也可以尝试使用
%xxxs xxx is an attribute in the HttpSession
在您的 AccessLogValve 配置中,以便从您的会话中打印另一个属性。
希望有帮助。
【讨论】:
"修改登录代码以将用户对象写入会话。"如果您能解释这一点会很有帮助,因为我不知道您在谈论什么登录代码或如何将用户对象写入会话。 @JimFord :“登录代码”是指验证用户的代码。某种 loginController 或者可能只是成功登录后被击中的第一个控制器 - 您已经拥有登录用户,然后您可以将其写入会话。【参考方案2】:如果您使用 Shiro 的本机会话管理, session.getPrincipal() 将按预期工作。如果您希望在默认会话管理中看到此调用工作,请打开 Jira 问题,我们会尽快修复它。
【讨论】:
Shiro能和其他工具集成就好了,我会尽快做票的,谢谢你的回复。 我正在使用 org.apache.shiro.web.session.mgt.DefaultWebSessionManager 并没有在我的访问日志中获得任何用户名。你能指出我正确的方向吗?以上是关于Shiro 和 Tomcat AccessLogValve的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.NoSuchFieldError:在Tomcat上部署shiro时出现subjectDAO异常
ssm整合shiro时web。xml中配置filter,tomcat报错
tomcat结合shiro无文件webshell的技术研究以及检测方法