JSP - Sicurezza

JavaServer Pages e servlet rendono disponibili diversi meccanismi agli sviluppatori Web per proteggere le applicazioni. Le risorse sono protette in modo dichiarativo identificandole nel descrittore di distribuzione dell'applicazione e assegnando loro un ruolo.

Sono disponibili diversi livelli di autenticazione, che vanno dall'autenticazione di base utilizzando identificatori e password all'autenticazione sofisticata mediante certificati.

Autenticazione basata sui ruoli

Il meccanismo di autenticazione nella specifica del servlet utilizza una tecnica chiamata role-based security. L'idea è che invece di limitare le risorse a livello di utente, crei ruoli e limiti le risorse per ruolo.

È possibile definire diversi ruoli nel file tomcat-users.xml, che si trova fuori dalla home directory di Tomcat in conf. Un esempio di questo file è mostrato di seguito:

<?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>

Questo file definisce una semplice mappatura tra username, password, e role. Si noti che un determinato utente può avere più ruoli; per esempio,username = "both" è nel ruolo "micio" e nel ruolo "ruolo1".

Dopo aver identificato e definito ruoli diversi, è possibile applicare restrizioni di sicurezza basate sui ruoli a diverse risorse dell'applicazione Web utilizzando il <security-constraint> elemento in web.xml file disponibile nella directory WEB-INF.

Di seguito è riportata una voce di esempio 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>

Le voci precedenti significherebbero:

  • Qualsiasi richiesta HTTP GET o POST a un URL corrispondente a / secured / * sarebbe soggetta alla restrizione di sicurezza.

  • Una persona con il ruolo di manager ha accesso alle risorse protette.

  • Il login-config elemento è usato per descrivere il BASIC forma di autenticazione.

Se provi a sfogliare qualsiasi URL incluso il file /securitydirectory, verrà visualizzata la seguente finestra di dialogo che richiede nome utente e password. Se fornisci un utente"admin" e password "secret", quindi avrai accesso all'URL corrispondente a /secured/* poiché abbiamo definito l'utente admin con ruolo di manager a cui è consentito accedere a questa risorsa.

Autenticazione basata su form

Quando si utilizza il metodo di autenticazione FORM, è necessario fornire un modulo di accesso per richiedere all'utente un nome utente e una password. Di seguito è riportato un semplice codice dilogin.jsp. Questo aiuta a creare un modulo per lo stesso scopo:

<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>

Qui devi assicurarti che il modulo di accesso debba contenere gli elementi del modulo denominati j_username e j_password. L'azione in<form> il tag deve essere j_security_check. POSTdeve essere utilizzato come metodo del modulo. Allo stesso tempo, dovrai modificare il file<login-config> tag per specificare il metodo di autenticazione come FORM -

<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>

Ora, quando provi ad accedere a qualsiasi risorsa con URL /secured/*, mostrerà il modulo sopra che richiede l'ID utente e la password. Quando il contenitore vede il "j_security_check", utilizza un meccanismo interno per autenticare il chiamante.

Se il login riesce e il chiamante è autorizzato ad accedere alla risorsa protetta, il contenitore utilizza un session-id per identificare una sessione di login per il chiamante da quel momento in poi. Il contenitore mantiene la sessione di accesso con un cookie contenente l'ID di sessione. Il server invia il cookie al client e, finché il chiamante presenta questo cookie con richieste successive, il contenitore saprà chi è il chiamante.

Se l'accesso non riesce, il server restituisce la pagina identificata dall'impostazione della pagina di errore del modulo

Qui, j_security_checkè l'azione che le applicazioni che utilizzano l'accesso basato su modulo devono specificare per il modulo di accesso. Nella stessa forma, dovresti anche avere un controllo di input di testo chiamatoj_username e a password input control chiamato j_password. Quando vedi questo, significa che le informazioni contenute nel modulo verranno inviate al server, che controllerà nome e password. Il modo in cui questo viene fatto dipende dal server.

Controlla le implementazioni di Realm standard per capire comej_security_check funziona per il contenitore Tomcat ..

Sicurezza programmatica in un servlet / JSP

Il HttpServletRequest object fornisce i seguenti metodi, che possono essere utilizzati per estrarre informazioni sulla sicurezza in fase di esecuzione:

S.No. Metodo e descrizione
1

String getAuthType()

Il getAuthType() restituisce un oggetto String che rappresenta il nome dello schema di autenticazione utilizzato per proteggere il Servlet.

2

boolean isUserInRole(java.lang.String role)

Il isUserInRole() restituisce un valore booleano: true se l'utente è nel ruolo dato o false se non lo è.

3

String getProtocol()

Il getProtocol()restituisce un oggetto String che rappresenta il protocollo utilizzato per inviare la richiesta. Questo valore può essere verificato per determinare se è stato utilizzato un protocollo protetto.

4

boolean isSecure()

Il isSecure()restituisce un valore booleano che rappresenta se la richiesta è stata effettuata utilizzando HTTPS. Un valore true significa che lo era e la connessione è sicura. Un valore false significa che la richiesta non lo era.

5

Principle getUserPrinciple()

Il getUserPrinciple() restituisce un oggetto java.security.Principle che contiene il nome dell'utente autenticato corrente.

Ad esempio, per una pagina JavaServer che collega a pagine per gestori, potresti avere il seguente codice:

<% if (request.isUserInRole("manager")) { %>
   <a href = "managers/mgrreport.jsp">Manager Report</a>
   <a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>

Controllando il ruolo dell'utente in un JSP o servlet, è possibile personalizzare la pagina Web per mostrare all'utente solo gli elementi a cui può accedere. Se hai bisogno del nome dell'utente così come è stato inserito nel modulo di autenticazione, puoi chiamare ilgetRemoteUser metodo nell'oggetto richiesta.