我正在使用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。请顺便提一下。
额外奖励信息:登录后您应该看到的页面有一个元素,只有在用户有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调用):
答案 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
个用户访问页面。在您当前的配置中,用户必须同时拥有两个角色才能访问/**
。