我只是尝试允许用户访问方法,如果他们经过身份验证,但我正在做的事情似乎没有用。有没有办法检查用户是否已通过身份验证?即使经过身份验证,以下内容仍然会拒绝用户...是否有经过身份验证的用户的内置角色?
@RequestMapping("/secure")
@PreAuthorize("hasRole('IS_AUTHENTICATED_FULLY')")
public String secure(ModelMap map){
return("secure");
}
答案 0 :(得分:12)
IS_AUTHENTICATED_FULLY
不是角色 - 它是AuthenticatedVoter
识别的预定义凭证(又名“魔术”字符串),表示您已登录。此选民还支持匿名并记住-me login。
角色由RoleVoter处理,它识别以“ROLE_”开头的任何刺痛(前缀是可配置的)。因此hasRole('IS_AUTHENTICATED_FULLY')
不起作用,因为它不是一个角色。 @RolesAllowed("IS_AUTHENTICATED_FULLY")
因同样的原因无效。
使用Spring表达式语言时,正确的表达式为:
@PreAuthorize("isAuthenticated()")
或者,您可以使用:
@Secured("IS_AUTHENTICATED_FULLY")
不需要自定义类 - 默认情况下都会启用两个选民。
答案 1 :(得分:1)
hasRole('ROLE_USER')
是经过身份验证的任何用户的传统名称。您通常会将ROLE_ANONYMOUS
用于您不关心此人是否经过身份验证的部分。
(稍后补充:)
我认为您需要实现一个自定义AccessDecisionVoter,只要参数身份验证的isAuthenticated()为true,ACCESS_GRANTED
为CONFIG_ATTRIBUTE
或者ROLE_USER
,就会始终投票{{1}}或类似。
在此forum discussion中对此进行了进一步的讨论,详细介绍了web.xml和其他配置。
答案 2 :(得分:1)
在自定义UserDetailService
实现中,只需在User
对象返回之前添加角色“IS_AUTHENTICATED_FULLY”。
答案 3 :(得分:0)
这就是我最终使用的内容:
@PreAuthorize("isAuthenticated()")
答案 4 :(得分:0)
这应该有效:
@PreAuthorize("isFullyAuthenticated()")