我正在使用 Spring 来处理我的 JSF 应用程序中的安全性。我有一个登录页面,/login
我已经像这样配置了 Spring:
<http authentication-manager-ref="authenticationManager">
<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/admin" access="ROLE_ADMIN" />
<intercept-url pattern="/javax.faces.resource/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />
<form-login login-page="/login" authentication-failure-url="/login" />
<logout logout-url="/logout" />
</http>
我希望管理员页面仅对具有该角色/admin
的用户可用。ROLE_ADMIN
拥有ROLE_ADMIN
或ROLE_USER
可能访问从应用程序根目录开始的页面的用户。
当我使用具有任一角色的用户登录时,我会看到登录后应该看到的页面。但是,无论我的下一个动作是什么,我都会被重定向到/login
就像我没有登录一样。有人可以解释一下,因为我现在正试图让这个东西工作一天。我一直在阅读 Spring 3.1.x 文档,但它并没有给我关于如何解决问题的线索。顺便说一句,我正在运行 Spring 3.1.1.Release。
额外奖励信息:登录后您应该看到的页面有一个元素,只有在用户拥有ROLE_ADIN
. 登录后我可以看到该元素。当我实现 PrettyFaces 时,问题就开始了。我在网上搜索了常见问题,只是想出了 PrettyFaces 过滤器应该出现在 Spring 安全过滤器之后。是这种情况,所以它应该可以正常工作吗?
更新:我已经更新了我的配置以使用表达式。然而问题依然存在。
<http authentication-manager-ref="authenticationManager" use-expressions="true">
<intercept-url pattern="/login" access="permitAll" />
<intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/javax.faces.resource/**" access="permitAll" />
<intercept-url pattern="/**" access="hasAnyRole('ROLE_ADMIN','ROLE_USER')" />
<form-login login-page="/login" authentication-failure-url="/login" />
<logout logout-url="/logout" />
</http>
登录后在 Firebug 控制台中的输出(页面尝试 AJAX 调用):