grails - Spring Security Grails插件授权

标签 grails groovy spring-security

背景

我正在使用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()记录了以下消息

user 'a5511120@nepwk.com' has roles: [USER]



因此,似乎已为用户分配了USER角色。但是,当我随后尝试访问此 Controller 的操作时:
@Secured(['ROLE_USER', 'ROLE_ADMINISTRATOR'])
class MyProfileController {
    def someAction = { // impl omitted }
}

我跳到拒绝访问页面。我非常确定该用户已登录,因为拒绝访问页面包含诸如以下的标记
<sec:ifLoggedIn>
  protected content
</sec:ifLoggedIn>

并显示 protected 内容。因此,当执行 Controller 授权时,似乎USER角色与当前用户不相关。日志消息表明UserDetailsService正常。

最佳答案



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

致谢

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

关于grails - Spring Security Grails插件授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7590564/

相关文章:

grails - Grails-如何在Criteria中使用命名查询

java - 在自定义身份验证过滤器中处理 Spring Boot 上的错误

Grails:使用 Spring Security 插件进行 Commentable 的用户评估器

java - 使用 Spring Security @configuration 的同一应用程序中的两个领域

grails - 过滤器中的渲染 GSP 不起作用

grails - Grails到 Controller View 文件夹的相对路径

grails - 在网址中隐藏ID

java - Java 类的 Groovy Spock 测试 - 如何模拟 Clob

groovy - 这个,所有者,Groovy 闭包中的委托(delegate)

grails - 创建常规类