2012-11-30 43 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