当前位置: 首页 > 知识库问答 >
问题:

Spring Security/Spring会话/Web套接字

谷梁存
2023-03-14

我们的Spring Security配置是

<!-- API security -->
<security:http use-expressions="false" realm="api" authentication-manager-ref="apiAuthenticationManager" entry-point-ref="accessDeniedAuthEntryPoint" pattern="/api/**" create-session="never">
    <security:custom-filter position="FIRST" ref="sessionRepositoryFilter" />
    <security:custom-filter position="PRE_AUTH_FILTER" ref="headerTokenAuthFilter" />
    <security:intercept-url pattern="/api/**" access="ROLE_USER" />


    <security:access-denied-handler  ref="accessDeniedHandler"  />

</security:http>

<security:authentication-manager id="apiAuthenticationManager">
    <security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>

<bean id="headerTokenAuthFilter" class="com.example.server.security.HeaderTokenAuthFilter" >
    <property name="authenticationManager" ref="apiAuthenticationManager"/>
    <property name="continueFilterChainOnUnsuccessfulAuthentication" value="false"/>
    <property name="checkForPrincipalChanges" value="true"/>
    <property name="sessionRepository" ref="sessionRepository" />
</bean>

<bean id="accessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl" />
<bean id="accessDeniedAuthEntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />

<bean id="sessionRepository" class="org.springframework.session.data.redis.RedisOperationsSessionRepository">
    <constructor-arg ref="jedisConnectionFactory"/>
</bean>
<bean id="sessionRepositoryFilter" class="org.springframework.session.web.http.SessionRepositoryFilter">
    <constructor-arg ref="sessionRepository"/>
</bean>

我们的websocket配置是

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebsocketConfiguration extends AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {

@Inject
private AuthenticationValidationInterceptor authenticationValidationInterceptor;
@Inject
private SelectorQuotingInterceptor selectorQuotingInterceptor;
@Inject
private SelectorValidationInterceptor selectorValidationInterceptor;

@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/stomp")
            .withSockJS().setSessionCookieNeeded(false);
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableStompBrokerRelay("/topic")
            .setRelayHost("localhost")
            .setRelayPort(7672);
    registry.setApplicationDestinationPrefixes("/api/data/streaming");
}

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
    registration.setInterceptors(
            authenticationValidationInterceptor,
            selectorValidationInterceptor,
            selectorQuotingInterceptor);
}

@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {

}

}

共有1个答案

姬天逸
2023-03-14

被诅咒者的同事。我们的配置在很大程度上是正确的,但我们的问题源于对安全上下文及其在websocket方面的可用性的一点误解。

从https://jira.spring.io/browse/sec-2179的各个子问题中收集的评论引导我们从拦截器中的消息中获取登录的用户主体

StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(message);
Principal userPrincipal = headerAccessor.getUser();

而不是

SecurityContextHolder.getContext().getAuthentication().getName();
 类似资料:
  • 我已经按照Quetion1和Quetion2从堆栈溢出发送消息到特定的客户端,基于其会话ID,但找不到成功。 下面是我的示例RestController类 会话ID:当客户端发送create会话请求时,会生成新的Spring会话ID,并将其存储在MongoDB中。之后,当客户端发送Web套接字连接请求时,会收到与预期存储在mongoDb中的相同的会话ID。直到一切正常。 现在,我的工作是根据Ses

  • 如果一个服务方法被标记为具有传播嵌套的,并且在它内部有许多对其他方法的调用,那么这些方法中的每一个都将使用自己的会话?它应该表示多个连接到db,只有一个方法调用no?

  • 我正在尝试建立一个基于Spring Boot的Web服务器,它支持基于会话的安全用户界面,包括CSRF保护和通过基本身份验证且不需要CSRF的无状态访问。我试图支持的两个用例是标准AngularJS用户界面和一个简单的REST api,可以对每个请求进行身份验证。 有人知道如何配置吗?我见过很多使用其中一个或另一个的例子,但不是同时使用两个。

  • 成功登录后,我想用新的url继续进行进一步的请求处理。但url正在调用springmvc中的公开服务,其中的安全配置不会检查会话身份验证以获取传入url。请看下面的代码。 当jsp页面提交登录验证时,J_security_check调用目标url,该URL随后调用拦截器模式/home*并验证登录凭证。 如果我在登录之前调用公开的服务“/address/userid/”,它将直接调用服务方法,使其成

  • 在WAR的情况下,它试图将请求转发到/error页面,并寻找它的处理程序方法(请参见底部的日志)。 最后我得到以下回应: 我该换什么才能得到401?

  • 1.导入jar包 web.xml spring-security.xml