我也跟着上設置與Java EE的WebSocket的端點本教程:的WebSocket安全 - 安全的一個WebSocket的Java EE中
由於顯而易見的原因有一些更多的工作有關的安全性做( 例如沒有SSL和訪問限制/認證)。
所以我的目標是使用SSL通過
- 改善的WebSocket安全(WSS://而不是WS://) - 完成
- 設置用戶認證(web.xml中) - 完成
- 執行SSL通信(web.xml)中 - 進行
- 確保與令牌(有限的壽命)
我的問題:如何驗證我在ServerEndpoint的LoginBean中創建的令牌?
Bonus問題:我是否錯過了在Java EE中確保websockets安全的一些重要部分?
這是我到目前爲止有:
ServerEndpoint
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/user/endpoint/{token}")
public class ThisIsTheSecuredEndpoint {
@OnOpen
public void onOpen(@PathParam("token") String incomingToken,
Session session) throws IOException {
//How can i check if the token is valid?
}
}
LoginBean
@ManagedBean
@SessionScoped
public class LoginBean {
public String login() {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest)facesContext.getExternalContext().getRequest();
try {
request.login("userID", "password");
HttpSession session = request.getSession();
// here we put the token in the session
session.setAttribute("token", "someVeeeeryLongRandomValue123hfgrtwpqllkiw");
} catch (ServletException e) {
facesContext.addMessage(null, new FacesMessage("Login failed."));
return "error";
}
return "home";
}
}
javascipt的
這是我想用來連接到WebSocket的代碼:
// use SSL
// retrive the token from session via EL-expression #{session.getAttribute("token")}
var wsUri = "wss://someHost.com/user/endpoint/#{session.getAttribute("token")}";
var websocket = new WebSocket(wsUri);
websocket.onerror = function(evt) { onError(evt) };
function onError(evt) {
writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
}
// For testing purposes
var output = document.getElementById("output");
websocket.onopen = function(evt) { onOpen(evt) };
function writeToScreen(message) {
output.innerHTML += message + "<br>";
}
function onOpen() {
writeToScreen("Connected to " + wsUri);
}
網絡的XML:
用固定 「/用戶/ *」 目錄登錄並執行SSL通信
<security-constraint>
...
<web-resource-name>Secured Area</web-resource-name>
<url-pattern>pathToSecuredDicrtoy</url-pattern>
...
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
...
</security-constraint>
<login-config>
<auth-method>FORM</auth-method> ...
</login-config>
備註:我使用JSF
任何反饋將不勝感激。
爲了使我加入' JSP servlet的名稱> *的.js URL模式> servlet的映射>' JavaScript的EL評價工作 到'web.xml'對於我的用例來說這沒問題,因爲頁面的訪問速度非常低。 –