JSP - Sicherheit
JavaServer Pages und Servlets stellen Webentwicklern verschiedene Mechanismen zur Verfügung, um Anwendungen zu sichern. Ressourcen werden deklarativ geschützt, indem sie im Anwendungsbereitstellungsdeskriptor identifiziert und ihnen eine Rolle zugewiesen werden.
Es stehen verschiedene Authentifizierungsebenen zur Verfügung, von der Basisauthentifizierung mithilfe von Kennungen und Kennwörtern bis hin zur anspruchsvollen Authentifizierung mithilfe von Zertifikaten.
Rollenbasierte Authentifizierung
Der Authentifizierungsmechanismus in der Servlet-Spezifikation verwendet eine Technik namens role-based security. Die Idee ist, dass Sie nicht Ressourcen auf Benutzerebene einschränken, sondern Rollen erstellen und die Ressourcen nach Rollen einschränken.
Sie können verschiedene Rollen in der Datei definieren tomcat-users.xml, das sich in Tomcats Home-Verzeichnis in conf befindet. Ein Beispiel für diese Datei ist unten dargestellt -
<?xml version = '1.0' encoding = 'utf-8'?>
<tomcat-users>
<role rolename = "tomcat"/>
<role rolename = "role1"/>
<role rolename = "manager"/>
<role rolename = "admin"/>
<user username = "tomcat" password = "tomcat" roles = "tomcat"/>
<user username = "role1" password = "tomcat" roles = "role1"/>
<user username = "both" password = "tomcat" roles = "tomcat,role1"/>
<user username = "admin" password = "secret" roles = "admin,manager"/>
</tomcat-users>
Diese Datei definiert eine einfache Zuordnung zwischen username, password, und role. Beachten Sie, dass ein bestimmter Benutzer möglicherweise mehrere Rollen hat. zum Beispiel,username = "both" ist in der Rolle "Kater" und der Rolle "Rolle1".
Sobald Sie verschiedene Rollen identifiziert und definiert haben, können rollenbasierte Sicherheitsbeschränkungen für verschiedene Webanwendungsressourcen mithilfe von festgelegt werden <security-constraint> Element in web.xml Datei im WEB-INF-Verzeichnis verfügbar.
Es folgt ein Beispieleintrag in web.xml -
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>SecuredBookSite</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>
Let only managers use this app
</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
...
</web-app>
Die obigen Einträge würden bedeuten -
Jede HTTP-GET- oder POST-Anforderung an eine URL, die mit / gesichert / * übereinstimmt, unterliegt der Sicherheitsbeschränkung.
Eine Person mit der Rolle eines Managers erhält Zugriff auf die gesicherten Ressourcen.
Das login-config Element wird verwendet, um die zu beschreiben BASIC Form der Authentifizierung.
Wenn Sie versuchen, eine URL zu durchsuchen, einschließlich der /securityVerzeichnis wird das folgende Dialogfeld angezeigt, in dem Sie nach Benutzername und Passwort gefragt werden. Wenn Sie einen Benutzer angeben"admin" und Passwort "secret"Dann haben Sie Zugriff auf die URL, die mit übereinstimmt /secured/* Wie wir den Benutzeradministrator mit Manager-Rolle definiert haben, der auf diese Ressource zugreifen darf.
Formularbasierte Authentifizierung
Wenn Sie die FORM-Authentifizierungsmethode verwenden, müssen Sie ein Anmeldeformular angeben, um den Benutzer zur Eingabe eines Benutzernamens und eines Kennworts aufzufordern. Es folgt ein einfacher Code vonlogin.jsp. Dies hilft beim Erstellen eines Formulars für denselben Zweck -
<html>
<body bgcolor = "#ffffff">
<form method = "POST" action ="j_security_check">
<table border = "0">
<tr>
<td>Login</td>
<td><input type = "text" name="j_username"></td>
</tr>
<tr>
<td>Password</td>
<td><input type = "password" name="j_password"></td>
</tr>
</table>
<input type = "submit" value = "Login!">
</form>
</body>
</html>
Hier müssen Sie sicherstellen, dass das Anmeldeformular die genannten Formularelemente enthalten muss j_username und j_password. Die Aktion in der<form> Tag muss sein j_security_check. POSTmuss als Formularmethode verwendet werden. Gleichzeitig müssen Sie die ändern<login-config> Tag, um die Auth-Methode als FORM anzugeben -
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>SecuredBookSite</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>Let only managers use this app</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
...
</web-app>
Nun, wenn Sie versuchen, mit auf eine Ressource zuzugreifen URL /secured/*Das obige Formular wird angezeigt, in dem Sie nach der Benutzer-ID und dem Kennwort gefragt werden. Wenn der Container das "j_security_check"Aktion verwendet es einen internen Mechanismus, um den Anrufer zu authentifizieren.
Wenn die Anmeldung erfolgreich ist und der Anrufer berechtigt ist, auf die gesicherte Ressource zuzugreifen, verwendet der Container eine Sitzungs-ID, um ab diesem Zeitpunkt eine Anmeldesitzung für den Anrufer zu identifizieren. Der Container verwaltet die Anmeldesitzung mit einem Cookie, das die Sitzungs-ID enthält. Der Server sendet das Cookie an den Client zurück. Solange der Anrufer dieses Cookie mit nachfolgenden Anforderungen präsentiert, weiß der Container, wer der Anrufer ist.
Wenn die Anmeldung fehlschlägt, sendet der Server die Seite zurück, die durch die Einstellung der Formularfehlerseite gekennzeichnet ist
Hier, j_security_checkist die Aktion, die Anwendungen mit formularbasierter Anmeldung für das Anmeldeformular angeben müssen. In derselben Form sollte auch ein Texteingabesteuerelement aufgerufen werdenj_username und ein password input control namens j_password. Wenn Sie dies sehen, bedeutet dies, dass die im Formular enthaltenen Informationen an den Server gesendet werden, der Name und Passwort überprüft. Wie dies gemacht wird, ist serverspezifisch.
Überprüfen Sie die Standard-Realm-Implementierungen, um zu verstehen, wiej_security_check funktioniert für Tomcat Container ..
Programmatische Sicherheit in einem Servlet / JSP
Das HttpServletRequest object bietet die folgenden Methoden, mit denen Sicherheitsinformationen zur Laufzeit abgebaut werden können:
S.No. | Methode & Beschreibung |
---|---|
1 | String getAuthType() Das getAuthType() Die Methode gibt ein String-Objekt zurück, das den Namen des Authentifizierungsschemas darstellt, das zum Schutz des Servlets verwendet wird. |
2 | boolean isUserInRole(java.lang.String role) Das isUserInRole() Die Methode gibt einen booleschen Wert zurück: true, wenn sich der Benutzer in der angegebenen Rolle befindet, oder false, wenn dies nicht der Fall ist. |
3 | String getProtocol() Das getProtocol()Die Methode gibt ein String-Objekt zurück, das das Protokoll darstellt, mit dem die Anforderung gesendet wurde. Dieser Wert kann überprüft werden, um festzustellen, ob ein sicheres Protokoll verwendet wurde. |
4 | boolean isSecure() Das isSecure()Die Methode gibt einen booleschen Wert zurück, der angibt, ob die Anforderung mit HTTPS gestellt wurde. Ein Wert von true bedeutet, dass dies der Fall war und die Verbindung sicher ist. Ein Wert von false bedeutet, dass die Anforderung nicht war. |
5 | Principle getUserPrinciple() Das getUserPrinciple() Die Methode gibt ein java.security.Principle-Objekt zurück, das den Namen des aktuell authentifizierten Benutzers enthält. |
Für eine JavaServer-Seite, die mit Seiten für Manager verknüpft ist, haben Sie möglicherweise den folgenden Code:
<% if (request.isUserInRole("manager")) { %>
<a href = "managers/mgrreport.jsp">Manager Report</a>
<a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>
Durch Überprüfen der Benutzerrolle in einer JSP oder einem Servlet können Sie die Webseite so anpassen, dass dem Benutzer nur die Elemente angezeigt werden, auf die er zugreifen kann. Wenn Sie den Benutzernamen benötigen, wie er im Authentifizierungsformular eingegeben wurde, können Sie den anrufengetRemoteUser Methode im Anforderungsobjekt.