Spring Security中@notation的IS_AUTHENTICATED_FULLY是什么意思?

3

我只是想在用户经过身份验证后允许他们访问一个方法,但是似乎我的所有尝试都没有起作用。是否有一种方法只检查用户是否已经通过身份验证?即使用户已经通过身份验证,以下代码仍会拒绝用户... 是否有一个内置的角色用于已通过身份验证的用户?

@RequestMapping("/secure")
@PreAuthorize("hasRole('IS_AUTHENTICATED_FULLY')")
public String secure(ModelMap map){
    return("secure");
}
5个回答

15

IS_AUTHENTICATED_FULLY不是角色,而是预定义的凭证(也称为“魔法”字符串),由AuthenticatedVoter识别以指示您已登录。该投票者还支持匿名和记住我登录。

角色由RoleVoter处理,它识别任何以"ROLE_"开头的字符串(前缀可配置)。因此hasRole('IS_AUTHENTICATED_FULLY')不起作用,因为它不是角色。@RolesAllowed("IS_AUTHENTICATED_FULLY")出于同样的原因也无法工作。

在使用Spring表达式语言时,正确的表达式如下:

 @PreAuthorize("isAuthenticated()")

你也可以使用以下方法:

 @Secured("IS_AUTHENTICATED_FULLY")

不需要自定义类 - 两个投票者默认都是启用的。


1

这是我最终使用的:

@PreAuthorize("isAuthenticated()")

1

hasRole('ROLE_USER') 是任何已验证用户的传统名称。您通常会在不关心该人是否已验证的部分中使用ROLE_ANONYMOUS

(后来添加:)

我认为您需要实现一个自定义的AccessDecisionVoter,每当参数authentication具有isAuthenticated() true且CONFIG_ATTRIBUTEROLE_USER或类似时,它将始终投票ACCESS_GRANTED

在这个论坛讨论中进一步讨论了这个问题,并提供了web.xml和其他配置的详细信息。


我正在使用默认的ldap-authentication-provider,没有角色映射。当用户通过身份验证时,我可以在日志中看到:“[DEBUG,DefaultLdapAuthoritiesPopulator]搜索的角色:[]”,是否有一种方法可以为任何经过身份验证的用户设置一个角色,而不是搜索ldap目录? - wuntee

1
在您的自定义UserDetailService实现中,只需在返回User对象之前将角色"IS_AUTHENTICATED_FULLY"添加到该对象即可。

0

这应该可以工作:

@PreAuthorize("isFullyAuthenticated()")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接