当前位置: 首页 > 面试题库 >

使用spring-security和来自websocket消息的访问主体来保护Spring-Webscoket

谢清野
2023-03-14
问题内容

Spring Security是一个非常好的框架,广泛用于身份验证和授权。

我有一个要求,其中使用j_spring_security_check对应用程序进行身份验证,并且只有授权用户才能向websocket处理程序提出请求。

我已经按照http://malalanayake.wordpress.com/2014/06/27/spring-security-on-rest-
api/
配置了Spring安全性

而且我已经按照http://syntx.io/using-websockets-in-java-using-
spring-4/
配置了websocket 。

我希望按照以下方式从handleTextMessage处理程序访问 MyPrincipal 主对象:

    @Override
    protected void handleTextMessage(WebSocketSession session,
            TextMessage message) throws Exception {
        System.out.println("Protocol: "+session.getAcceptedProtocol());
        TextMessage returnMessage = new TextMessage(message.getPayload()
                + " received at server");
        System.out.println("myAttrib="
                + session.getAttributes().get("myAttrib"));
        MyPrincipal user = (MyPrincipal) ((Authentication) session
                .getPrincipal()).getPrincipal();
        System.out.println("User: " + user.getUserId());
        session.sendMessage(returnMessage);
    }

请尽快重播。


问题答案:

HttpSessionHandshakeInterceptor在websocket配置中添加允许将Spring
Security主体对象从传递SpringSecurityContextWebsocketSession

编辑: HandshakeInterceptor.java

public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{

    @Override
    public boolean beforeHandshake(ServerHttpRequest request,
            ServerHttpResponse response, WebSocketHandler wsHandler,
            Map<String, Object> attributes) throws Exception {
        System.out.println("Before Handshake");
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request,
            ServerHttpResponse response, WebSocketHandler wsHandler,
            Exception ex) {
        System.out.println("After Handshake");
        super.afterHandshake(request, response, wsHandler, ex);
    }

}

websocket.xml

<bean id="websocket" class="co.syntx.example.websocket.handler.WebsocketEndPoint"/>

<websocket:handlers>
    <websocket:mapping path="/websocket" handler="websocket"/>
    <websocket:handshake-interceptors>
    <bean class="co.syntx.example.websocket.HandshakeInterceptor"/>
    </websocket:handshake-interceptors>
</websocket:handlers>


 类似资料:
  • 我正在开发一个spring rest项目,并使用OAuth2.0来保护这些API免受未经授权的访问。 前端:Angular.js后端:Spring Rest+Spring Security+Oauth2 2)我从后端获得了一个令牌,并使用该令牌来访问API。 现在我的问题是,一旦我用/oauth/token点击后端?grant_type=password&client_id=angularapp&

  • 有没有办法只使用spring security实现CSRF保护,而不使用身份验证和授权等其他功能? 我尝试了以下配置,但它关闭了spring security的所有功能。想知道是否有一种方法可以配置csrf功能。

  • 我正在尝试为我的Spring应用程序实现一个REST API。因为有些资源可能不是每个人都可以访问的,所以我需要一个安全层。 我不知道该如何进行。使用Spring Security保护REST API的最佳方法是什么?

  • 问题内容: 我知道保护REST API是一个被广泛评论的话题,但是我无法创建一个符合我的标准的小型原型(并且我需要确认这些标准是现实的)。如何保护资源以及如何使用Spring安全性有很多选择,我需要弄清楚我的需求是否现实。 我的要求 基于令牌的身份验证器-用户将提供其凭据,并获得唯一且受时间限制的访问令牌。我想在自己的实现中管理令牌的创建,检查有效性和到期时间。 某些REST资源将是公开的-完全不

  • null 当前状态 请给我一些如何开始的点子。

  • 我正在开发一个模块,它使用来自Kafka主题的消息并发布到下游系统。在下游系统不可用的情况下,消费者不确认Kakfa消息。因此,当我的消费者收到消息时,当下游系统不可用时,kakfa的偏移量将不会被提交。但是如果我在下游系统启动后收到新消息,并且当我确认该消息时,最新的偏移量将被提交,并且消费者永远不会收到主题中没有偏移量提交的那些消息。