2012-11-30 28 views
2

在我的情况(Tomcat)的我使用Tomcat-users.xml中管理用户和角色如何将http会话的角色传递给websocket?

<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. application.jsp用服务器和webSocket打开一个WebSocket创建一个session.java。所有通信都将通过WebSocket完成。问题是在webSocket的上下文中,我不知道我的用户的角色。

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

回答

0

WebSockets连接从一个普通的HTTP请求/响应开始,因此您应该能够像平常一样收集所有相关的用户详细信息。

0

我不知道你使用的是在你的JSP什么,如果你使用的是Tomcat的WebSocket类,当您使用

createWebSocketInbound 

protected abstract StreamInbound createWebSocketInbound(String subProtocol, 
                 HttpServletRequest request) 

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

+0

是的,它正在与tomcat合作。谢谢 – Chris

+0

我仍然有一个问题...我如何从请求中获取用户的所有角色。我可以检查他是否与'isUserInRole'有关,但我不知道如何做'getAllRoles'。这个想法是设置用户的所有角色连接到一个类实例'UserConnected'的变量'角色' – Chris

+0

获得所有角色在servlet规范中不被支持。你必须提前知道你需要什么样的角色。角色可以通过web.xml映射到其他角色 – spy