【问题标题】:How to pass the roles of a http session to a websocket?如何将 http 会话的角色传递给 websocket?
【发布时间】:2012-12-01 06:00:04
【问题描述】:

在我的情况下(tomcat),我使用 tomcat-users.xml 来管理用户和角色之间的链接

<tomcat-users>
    <role rolename="role1"/>
    <role rolename="role2"/>
    <user password="tomcat" roles="tomcat" username="tomcat"/>
    <user password="123456" roles="role1,role2" username="user1"/>
</tomcat-users>

web.xml 是这样配置的:

<listener>
    <listener-class>com.WebSocketServletListener</listener-class>
</listener>
<security-constraint>
    <display-name>Tomcat Server Configuration Security Constraint</display-name>
    <web-resource-collection>
      <web-resource-name>Protected Area</web-resource-name>     
      <url-pattern>/application.jsp</url-pattern>           
    </web-resource-collection>
    <auth-constraint>
      <role-name>role1</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>Cloud Authentication</realm-name>
    <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
</login-config>

与应用程序的连接有两个步骤:

  1. 我通过“login.jsp”记录我的应用程序,将我引向我的应用程序“application.jsp”的单个页面。在 application.jsp 我可以知道与 request.isUserInRole("role1");

  2. 连接的用户的角色
  3. application.jsp 使用服务器打开一个 WebSocket,该 WebSocket 创建一个 session.java。所有通信都将通过 WebSocket 完成。问题出在 webSocket 的上下文中,我不知道我的用户的角色。

在 webSocket 的会话中恢复所有用户信息的最佳方法是什么?

【问题讨论】:

    标签: java session tomcat websocket


    【解决方案1】:

    WebSockets 连接以正常的 HTTP 请求/响应开始,因此您应该能够正常收集所有相关的用户详细信息。

    【讨论】:

    • 这不回答如何在Tomcat中做到这一点
    【解决方案2】:

    我不知道你在你的JSP中使用的是什么,如果你使用的是Tomcat Websocket类,当你使用时

    createWebSocketInbound
    
    protected abstract StreamInbound createWebSocketInbound(String subProtocol,
                                                            HttpServletRequest request)
    

    您可以阅读HttpServletRequest request,您应该能够获取所有握手数据并将连接映射到用户。它应该与 JSP 请求具有相同的上下文,但为了提高安全性,您可能应该直接在您编写的用于处理 webSocket 连接的代码中处理 HttpServletRequest request

    【讨论】:

    • 我还有一个问题...如何从请求中获取用户的所有角色。我可以检查他是否在“isUserInRole”中担任角色,但我不知道如何执行“getAllRoles”。这个想法是将用户的所有角色连接到类实例“UserConnected”的变量“角色”
    • 获取所有角色在 servlet 规范中不受支持。你真的必须提前知道你需要什么角色。角色可以通过 web.xml 映射到其他角色
    • @Axel 你能详细说明你指的是哪个tomcat websocket类吗?
    • 如果每个文档已弃用 org.apache.catalina.websocket.WebSocketServletDeprecated. Replaced by the JSR356 WebSocket 1.1 implementation and will be removed in Tomcat 8.0.x.
    猜你喜欢
    • 2018-02-12
    • 2016-07-10
    • 1970-01-01
    • 2017-10-26
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 2020-07-19
    相关资源
    最近更新 更多