0

我无法从 Grails 3.2.8 中的控制器获取 springSecurityService.currentUser 。

请注意,Grails 3.2.8 进行了一些性能改进,而之前的版本似乎破坏了 Spring Security Core。根据域类中的 Grails 3.2.8 依赖注入,我设置了 grails.gorm.autowire = true,从而解决了该不兼容问题。

重现步骤:

  1. 使用角色和组使用 Spring Security 3.1.1 创建一个新的 Grails 3.2.8 Web 应用程序。

  2. 在 application.yml 中,设置 grails.gorm.autowire = true

  3. 在引导程序中:

    def init = { servletContext ->
        User user = new User(username: 'foo', password:'foo').save(flush: true)
        Role role = new Role(authority: 'SomeRole').save(flush: true)
        RoleGroup roleGroup = new RoleGroup(name: 'SomeRole').save(flush: true)
        RoleGroupRole.create(roleGroup, role)
        UserRoleGroup.create(user, roleGroup)
    }
    
  4. 创建一个控制器TestController:

    @Secured(['SomeRole'])
    class TestController {
        def springSecurityService
    
        def index() {
            println "springSecurityService==null? ${(springSecurityService==null).toString()}"
            println "SecurityContextHolder.context==null? ${(SecurityContextHolder.context==null).toString()}"
            println "SecurityContextHolder.context?.authentication==null? ${(SecurityContextHolder.context?.authentication==null).toString()}"
            println "springSecurityService.principal==null? ${(springSecurityService.principal==null).toString()}"
            println "springSecurityService.currentUser==null? ${(springSecurityService.currentUser==null).toString()}"
    
            render "1" //Render something so we don't get an exception.
        }
    }
    
  5. 启动服务器并转到 /test。输出是:

    springSecurityService==null? false
    SecurityContextHolder.context==null? false
    SecurityContextHolder.context?.authentication==null? true
    springSecurityService.principal==null? true
    springSecurityService.currentUser==null? true`
    

有没有好的解决方法?

4

2 回答 2

0

如果SecurityContextHolder.context不是 null(它永远不应该为 null)而是 SecurityContextHolder.context?.authentication为 null,那么这可能不是 Grails 或插件问题 - 您没有经过身份验证。因此,没有任何主体可以从中获取缓存的用户 ID(即springSecurityService.principal,您的输出显示为 null),并且无法检索当前的 User 实例。

于 2017-03-29T09:16:26.177 回答
0

解决了。从 3.2.8 版开始,application.yml 中有这个默认设置:grails.gorm.autowire=false。您必须将其设置为 true,然后服务会像往常一样自动装配。

于 2017-04-22T22:38:52.730 回答