【发布时间】:2015-06-03 19:52:34
【问题描述】:
此处的实现 (http://grails.org/plugin/spring-websocket) 正在运行,但是 Spring Security 插件无法识别经过身份验证的用户。我可以想象为什么这不起作用,但是有人设法让这个控制器中的 springSecurityService 识别经过身份验证的用户吗?
我的控制器目前看起来像这样:
@Secured('hasRole("ROLE_USER")')
class WebsocketChatController {
SpringSecurityService springSecurityService
def index() {}
@MessageMapping("/hello")
@SendTo("/topic/hello")
protected String hello(String world) {
return "hello from controller! ( character: " + springSecurityService.currentUser + ")"
}
}
但是 springSecurityService.currentUser 是 null ...
【问题讨论】:
-
我认为您将在这里遇到的问题是 Spring Security 和 springSecurityService 使用 ThreadLocal 变量来存储主体/身份验证信息。该变量在 HTTP 请求结束时被清除。阅读 Spring 4.x WebSockets (docs.spring.io/spring/docs/current/spring-framework-reference/…) 的文档,我会明白这是在与原始请求不同的线程中运行的,因此 spring security 已经清除了该信息。
-
为 spring security
debug 'org.springframework.security'启用调试可能会显示 spring security 正在做什么以及何时清除此信息。
标签: grails spring-security websocket