我正在使用Spring Security Grails插件。因为我的用户和角色类不是GORM对象,所以我用自己的实现替换了插件提供的UserDetailsService
:
class CustomUserDetailsService implements UserDetailsService {
static transactional = false
private static final log = LogFactory.getLog(this)
@Autowired
private UserManager userManager
@Autowired
private RoleManager roleManager
UserDetails loadUserByUsername(String username) {
User user = userManager.getUserByEmail(username)
UserDetails userDetails = new UserAdapter(user, roleManager)
log.debug "user '$username' has roles: ${userDetails.authorities?.authority}"
userDetails
}
}
当我登录时,我看到从CustomUserDetailsService.loadUserByUsername()
用户'a5511120@nepwk.com'有角色:[USER]
因此似乎已为用户分配了USER角色。但是,当我尝试访问此控制器的操作时:
@Secured(['ROLE_USER', 'ROLE_ADMINISTRATOR'])
class MyProfileController {
def someAction = { // impl omitted }
}
我被反弹到访问被拒绝页面。我很确定用户已登录,因为访问被拒绝页面包含标记,例如
<sec:ifLoggedIn>
protected content
</sec:ifLoggedIn>
并显示受保护的内容。因此,当执行控制器授权时,似乎某种程度上USER角色与当前用户无关。日志消息表明UserDetailsService
正常。
答案 0 :(得分:0)
解决方案是根据注释参数确保域类/数据库中的角色名称以“ROLE_”开头。
这个答案的所有功劳归功于@BurtBeckwith和@tim_yates,他们在评论中提供了解决方案。我正在将他们的评论转换成答案,因为未来的读者很容易错过他们的评论。