2017-01-04 3 views
0

Может кто-нибудь, пожалуйста, посоветуйте, как защитить конечную точку веб-сокета с использованием Spring Security framework?Spring Security: как настроить WebSocket с zoneinfo

У меня есть приложение, защищенное весной. Одна из конечных точек - это веб-сокет. Внутри обработчика веб-сокетов мне нужно аутентифицировать пользователя, подключающегося к веб-соке. В частности, мне нужно приобрести идентификатор пользователя, а также идентификатор зоны/арендатора.

Если я использую тег сек: HTTP для WebSocket конечной точки в весенне-security.xml (см файл ниже), это делает вызвать логин, а затем внутри веб-сокет @onOpen (сессию Session) обработчика Когда я вызываю session.getUserPrincipal(), возвращаемый директор имеет правильное имя пользователя внутри него.

Однако мне также нужна информация о зоне/арендаторе.

Я пытаюсь использовать SecurityContextHolder.getContext(). GetAuthentication(), который должен содержать его, но вызов возвращает null. По-видимому, sec: http не создает объект аутентификации для запросов веб-сокетов.

Я был передан

http://docs.spring.io/autorepo/docs/spring-security/4.1.x/reference/html/websocket.html

http://docs.spring.io/autorepo/docs/spring-security/4.1.x/reference/html/appendix-namespace.html#nsa-websocket-security

, что, кажется, посоветуйте, что для получения аутентификатора с информацией зоны в ней для WebSocket конечной точки, мне нужно добавить следующий раздел spring-security.xml:

<sec:websocket-message-broker> 
    <sec:intercept-message pattern="/WebSocket.svc" access="isAuthenticated()" /> 
</sec:websocket-message-broker> 

Однако, когда я добавляю его и пытаюсь запустить приложение, он не работает с следующей трассировкой/сообщением:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Security namespace does not support decoration of element [websocket-message-broker] 
Offending resource: ServletContext resource [/WEB-INF/spring-security.xml] 
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.fatal(FailFastProblemReporter.java:60) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:68) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:55) ~[spring-beans-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.security.config.SecurityNamespaceHandler.reportUnsupportedNodeType(SecurityNamespaceHandler.java:144) ~[spring-security-config-4.1.2.RELEASE.jar:4.1.2.RELEASE] 

Я использую Spring Security 4.1.2 и 4.3.1 для мастер-пружины.

Также неясно, с весны документации ли сек: WebSocket-сообщение-брокер и сек: HTTP следует использовать в сочетании для веб-сокетов конечной точки или взаимно исключают друг друга.

Благодарим за консультацию.

Sergey

P.S. Моя весна-security.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" ?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:oauth="http://www.springframework.org/schema/security/oauth2" 
    xmlns:sec="http://www.springframework.org/schema/security" 
    xmlns:websocket="http://www.springframework.org/schema/websocket" 
    xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 
     http://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-4.1.xsd 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> 

    <sec:http pattern="/Consumer.svc/**" create-session="never" 
     entry-point-ref="oauthAuthenticationEntryPoint" 
     access-decision-manager-ref="accessDecisionManager" 
     authentication-manager-ref="authenticationManager" 
     use-expressions="true"> 
     <sec:anonymous enabled="false" /> 
     <sec:intercept-url pattern="/Consumer.svc/**" access="isAuthenticated()" /> 
     <sec:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" /> 
     <sec:access-denied-handler ref="oauthAccessDeniedHandler" /> 
    </sec:http> 

    <sec:http pattern="/WebSocket.svc" create-session="never" 
     entry-point-ref="oauthAuthenticationEntryPoint" 
     access-decision-manager-ref="accessDecisionManager" 
     authentication-manager-ref="authenticationManager" 
     use-expressions="true"> 
     <sec:anonymous enabled="false" /> 
     <sec:intercept-url pattern="/WebSocket.svc" access="isAuthenticated()" /> 
     <sec:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" /> 
     <sec:access-denied-handler ref="oauthAccessDeniedHandler" /> 
    </sec:http> 

    <sec:websocket-message-broker> 
     <sec:intercept-message pattern="/WebSocket.svc" access="isAuthenticated()" /> 
    </sec:websocket-message-broker> 

    <bean id="oauthAuthenticationEntryPoint" 
     class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint"> 
    </bean> 

    <bean id="oauthWebExpressionHandler" 
     class="org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandler"> 
    </bean> 

    <bean id="accessDecisionManager" 
     class="org.springframework.security.access.vote.UnanimousBased"> 
     <constructor-arg> 
      <list> 
       <bean class="org.springframework.security.web.access.expression.WebExpressionVoter"> 
        <property name="expressionHandler" ref="oauthWebExpressionHandler" /> 
       </bean> 
       <bean class="org.springframework.security.access.vote.AuthenticatedVoter" /> 
      </list> 
     </constructor-arg> 
    </bean> 

    <sec:authentication-manager alias="authenticationManager"/> 

    <oauth:resource-server id="resourceServerFilter" 
     resource-id="springsec" token-services-ref="offlineTokenServices" /> 

    <bean id="oauthAccessDeniedHandler" 
     class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" /> 

    <!-- ... also some other elements here ... --> 

</beans> 

ответ

0

Это было необходимо добавить следующее pom.xml:

<dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-messaging</artifactId> 
     <version>4.1.2.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-messaging</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-websocket</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

И это весна-security.xml:

<bean id="springSecurityMessagePathMatcher"  
class="org.springframework.util.AntPathMatcher"/> 

Теперь Spring не генерирует исключения при запуске и анализирует весеннюю безопасность.xml отлично, но он тоже не работает. SecurityContextHolder.getContext(). GetAuthentication() по-прежнему возвращает null.