Grails 3.2.8无法在控制器中获取springSecurityService.currentUser

时间:2017-03-28 20:29:24

标签: grails spring-security grails3

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

请注意,Grails 3.2.8取得了一些性能改进,而不是之前的版本似乎打破了Spring Security Core。根据{{​​3}},我设置了grails.gorm.autowire = true,它修复了这种不兼容性。

重现的步骤:

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

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

  3. 在Bootstrap:

    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`
    
  6. 有一个好的解决方法吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

解决。从版本3.2.8开始,application.yml中有这个默认设置:grails.gorm.autowire = false。你必须将它设置为true,然后服务一如既往地自动装配。