folgte ich dieses Tutorial zum Einrichten eines websocket Endpunkt mit Java EE up:websocket Sicherheit - Sichern Sie sich einen Websocket in Java EE
Aus offensichtlichen Gründen gibt es einige mehr Arbeit in Bezug auf die Sicherheit getan werden (zB keine SSL und Zugangsbeschränkung/Authentifizierung).
So ist mein Ziel websocket Sicherheit von
- mit SSL zu verbessern (WSS: // statt ws: //) - fertig
- Setup-Benutzerauthentifizierung (web.xml) - fertig
- SSL-Kommunikation (web.xml) erzwingen - fertig
- die websocket Verbindung mit einem Token (begrenzte Lebensdauer) sichern
Meine Frage: Wie kann ich das Token, das ich in der LoginBean am ServerEndpoint erstellt habe, überprüfen?
Bonusfrage: Habe ich einige wichtige Teile bei der Sicherung von Websockets in Java EE vermisst?
Dies ist, was ich bisher:
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
dies ist der Code, den ich verwenden möchte den websocket verbinden:
// 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);
}
web-xml:
sichern "/ user/*" Verzeichnis mit einem Anmelden und SSL-Kommunikation erzwingen
<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>
Hinweis: Ich verwende JSF
Jede Rückmeldung würde sehr geschätzt werden.
Javascript el Auswertung Arbeit mache ich 'hinzugefügt jsp servlet-name> * js url-pattern> servlet-mapping>' zu der 'web.xml' Für meinen Anwendungsfall ist das ok, da die Seite sehr niedrige Zugriffsraten hat. –