1

我使用Shiro(v1.2.1)作为安全框架,它运行良好,但是在Tomcat(v7.0.32)的访问日志中,当经过身份验证的用户访问任何资源时,您无法让远程用户登录。Shiro对于我的示例 Web 应用程序,我使用了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.

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

4

2 回答 2

0

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

对于 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() 的结果不是你想要的,你也可以尝试使用

%{xxx}s xxx is an attribute in the HttpSession

在您的 AccessLogValve 配置中,以便从您的会话中打印另一个属性。

希望有帮助。

于 2012-11-14T08:19:06.690 回答
0

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

于 2012-11-14T17:28:47.470 回答