Shiro和Tomcat AccessLogValve

时间:2012-11-13 06:27:50

标签: java java-ee tomcat shiro

我使用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.

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我不确定这是否是官方解决方案,但这是一个适合我的解决方案:

对于AccessLogValve模式,请使用

%u - Remote user that was authenticated (if any), else '-'

这将打印“猜到的用户名”。如果你问google 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()的结果不是您想要的结果,您也可以尝试使用

%{xxx}s xxx is an attribute in the HttpSession
在AccessLogValve配置中

,以便从会话中打印另一个属性。

希望有所帮助。

答案 1 :(得分:0)

如果您正在使用Shiro的本机会话管理,则session.getPrincipal()将按预期工作。如果您希望在默认会话管理中看到此调用有效,请打开Jira问题,我们会看看是否可以尽快修复它。