我无法从Grails 3.2.8中的控制器获取springSecurityService.currentUser。
请注意,Grails 3.2.8取得了一些性能改进,而不是之前的版本似乎打破了Spring Security Core。根据{{3}},我设置了grails.gorm.autowire = true,它修复了这种不兼容性。
重现的步骤:
使用角色和群组使用Spring Security 3.1.1创建新的Grails 3.2.8 Web应用程序。
在application.yml中,设置grails.gorm.autowire = true
在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)
}
创建一个控制器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.
}
}
启动服务器并转至/ test。输出是:
springSecurityService==null? false
SecurityContextHolder.context==null? false
SecurityContextHolder.context?.authentication==null? true
springSecurityService.principal==null? true
springSecurityService.currentUser==null? true`
有一个好的解决方法吗?
答案 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,然后服务一如既往地自动装配。