使用Spring Security Grails插件进行授权

时间:2011-09-28 22:47:59

标签: grails groovy spring-security

背景

我正在使用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正常。

1 个答案:

答案 0 :(得分:0)

解决方案

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

致谢

这个答案的所有功劳归功于@BurtBeckwith和@tim_yates,他们在评论中提供了解决方案。我正在将他们的评论转换成答案,因为未来的读者很容易错过他们的评论。