繁体   English   中英

Spring Security Grails插件授权

[英]authorisation with Spring Security Grails plugin

背景

我正在使用Spring Security Grails插件。 因为我的User和Role类不是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正常。

解决方案是根据注释参数,确保域类/数据库中的角色名称以“ ROLE_”开头。

致谢

此答案的全部功劳归于@BurtBeckwith和@tim_yates,他们在评论中提供了解决方案。 我正在将他们的评论转换为答案,因为将来的读者可能会很容易错过他们的评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM