成功登录后意外重定向到登录页面

时间:2012-09-13 15:05:12

标签: spring jsf spring-security prettyfaces

我正在使用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。请顺便提一下。

额外奖励信息:登录后您应该看到的页面有一个元素,只有在用户有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 console log

1 个答案:

答案 0 :(得分: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_ADMIN xor ROLE_USER个用户访问页面。在您当前的配置中,用户必须同时拥有两个角色才能访问/**