Grails 3.2.8 无法在控制器中获取 springSecurityService.currentUser
Grails 3.2.8 not able to get springSecurityService.currentUser in controller
我无法从 Grails 3.2.8 中的控制器获取 springSecurityService.currentUser。
请注意,Grails 3.2.8 进行了一些以前版本中没有的性能改进,这些改进似乎破坏了 Spring 安全核心。根据 ,我设置 grails.gorm.autowire = true,这解决了不兼容问题。
重现步骤:
使用角色和组创建新的 Grails 3.2.8 网络应用 Spring Security 3.1.1。
在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`
有什么好的解决方法吗?
如果 SecurityContextHolder.context
不为空(它永远不应该为空)但是
SecurityContextHolder.context?.authentication
为空,那么这可能不是 Grails 或插件问题 - 您未通过身份验证。因此,没有主体可以从中获取缓存的用户 ID(即 springSecurityService.principal
为 null,如您的输出所示)并且无法检索当前的 User 实例。
已解决。从版本 3.2.8 开始,application.yml 中有这个默认设置:grails.gorm.autowire=false。您必须将其设置为 true,然后服务会像往常一样自动装配。
我无法从 Grails 3.2.8 中的控制器获取 springSecurityService.currentUser。
请注意,Grails 3.2.8 进行了一些以前版本中没有的性能改进,这些改进似乎破坏了 Spring 安全核心。根据
重现步骤:
使用角色和组创建新的 Grails 3.2.8 网络应用 Spring Security 3.1.1。
在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`
有什么好的解决方法吗?
如果 SecurityContextHolder.context
不为空(它永远不应该为空)但是
SecurityContextHolder.context?.authentication
为空,那么这可能不是 Grails 或插件问题 - 您未通过身份验证。因此,没有主体可以从中获取缓存的用户 ID(即 springSecurityService.principal
为 null,如您的输出所示)并且无法检索当前的 User 实例。
已解决。从版本 3.2.8 开始,application.yml 中有这个默认设置:grails.gorm.autowire=false。您必须将其设置为 true,然后服务会像往常一样自动装配。