这是关于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")
-一切都变好了。