0

我正在使用 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_ADMINROLE_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 调用):

Firebug 控制台日志

4

1 回答 1

1

首先,在遇到问题时始终调试 Spring Security(添加log4j.logger.org.springframework.security=DEBUG)。

其次,我认为您想要hasAnyRole

<intercept-url pattern="/**" access="hasAnyRole(ROLE_ADMIN,ROLE_USER)" />

加上添加use-expressions="true"http

<http authentication-manager-ref="authenticationManager" use-expressions="true">

允许ROLE_ADMINROLE_USER或用户访问页面。在您当前的配置中,用户必须同时拥有两个角色才能访问/**

于 2012-09-13T16:06:40.843 回答