2015-12-14 343 views
1

訪問用戶名在套接字控制器方法中我正在實現到我們的Web應用程序的彈簧web套接字,我想訪問套接字控制器方法中的用戶名,但我得到它爲null。在彈簧安全與彈簧websocket集成彈簧安全性和

下面是代碼

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

    return stringRet; 
} 

春季安全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> 

的插槽配置看起來像這樣

<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配置,但是我有這個問題是,當我使用java配置,它是添加一個額外的/信息到目標網址,它甚至不連接到套接字,所以我採取了XML路線。

我對春天的網絡套接字很新穎,我想我在將它與彈簧安全整合時錯過了一些東西,但這只是我。讓我知道我在這裏做錯了什麼?

回答

1

您可以通過將java.security.Principal參數添加到套接字控制器方法來訪問當前用戶。

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

docs

+0

太謝謝你了! – user1707141