【问题标题】:Accessing user name in the socket controller method while Integrating spring security with spring websocket and在将spring security与spring websocket集成时在socket控制器方法中访问用户名和
【发布时间】:2015-12-14 22:09:19
【问题描述】:

我正在将 Spring Web 套接字实现到我们的 Web 应用程序中,我想在套接字控制器方法中访问用户名,但我将其设为 null。

这里是代码

@MessageMapping("/user/sockettest" )
@SendTo("/topic/sockettestresult")
public String sockAdd(ListId[] listIds) {
    ..
    SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    return stringRet;
}

spring-security xml 看起来像这样

    <sec:intercept-url pattern="/topic/**" access="permitAll" />

    <sec:intercept-url pattern="/" access="permitAll" />
    <sec:intercept-url pattern="/login*" access="permitAll" />
    <sec:intercept-url pattern="/resources/**" access="permitAll" />

    <sec:form-login login-page="/login" default-target-url="/user/home" always-use-default-target="true" authentication-failure-url="/login?error"/>
    <sec:logout logout-success-url="/login?logout" delete-cookies="JSESSIONID" />
    <sec:access-denied-handler error-page="/denied"/>
    <sec:intercept-url pattern="denied/*" access="permitAll" />

    <sec:csrf disabled="true" />
</sec:http>

socket 配置如下所示

    <websocket:stomp-endpoint path="/user/sockettest">
    <websocket:sockjs/>
    </websocket:stomp-endpoint>

    <websocket:simple-broker prefix="/topic"/>

    <websocket:message-converters register-defaults="false">
        <bean id="mappingJackson2MessageConverter" class="org.springframework.messaging.converter.MappingJackson2MessageConverter">
            <property name="objectMapper" ref="objectMapper"></property>
        </bean>
    </websocket:message-converters>
</websocket:message-broker>

我查看了一些示例,其中大多数都在 java config 中,但是我遇到的问题是,当我使用 java config 时,它会在目标 url 中添加一个额外的 /info 并且它甚至没有连接到套接字,所以我采用 xml 路由。

我对 Spring Web 套接字还很陌生,我想我在将它与 Spring Security 集成时遗漏了一些东西,但这只是我。让我知道我在这里做错了什么?

【问题讨论】:

    标签: java spring-mvc spring-security spring-websocket


    【解决方案1】:

    您可以通过在套接字控制器方法中添加java.security.Principal 参数来访问当前用户。

    @MessageMapping("/user/sockettest" )
    @SendTo("/topic/sockettestresult")
    public String sockAdd(ListId[] listIds, Principal principal) {
        //do whatever you want 
        return stringRet;
    }
    

    docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2014-10-24
      • 2016-03-11
      • 2014-05-22
      • 2013-11-25
      相关资源
      最近更新 更多