这是关于Spring v.4(MVC +安全性)。我已经实现了UserDetailsServiceImpl,在loadUserByUsername方法中,授予了用户权限。让我们说这很简单:

public UserDetails loadUserByUsername(String username) {
    ...
    Collection<GrantedAuthority> authorities = new ArrayList<>();

    authorities.add(new SimpleGrantedAuthority("ADMIN"));

    return new org.springframework.security.core.userdetails.User(username, password, enabled, true, true, true, authorities);
    ...
}
还有一个安全 Controller ,其中有一个带有@Secured批注的批注方法:
@Secured("ADMIN")
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String users(Model model ...) { ... }
如您所见,在loadUserByUsername方法内部,我向用户明确授予了ADMIN角色。
但是,当我尝试访问/users时,出现了Access is denied异常:

(没有@Secured注释,一切正常。)
我在这里错过了什么?

最佳答案

令人惊讶的是,问题出在角色名称上。由于defaultRolePrefix设置为ROLE_(请参阅org.springframework.security.access.vote.RoleVoter类),因此所有角色的名称都应以ROLE_前缀开头。换句话说,当我改变了authorities.add(new SimpleGrantedAuthority("ADMIN"));authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));@Secured("ADMIN")@Secured("ROLE_ADMIN")-一切都变好了。

10-07 23:03