JSP - Keamanan

Halaman JavaServer dan servlet menyediakan beberapa mekanisme bagi pengembang Web untuk mengamankan aplikasi. Resource dilindungi secara deklaratif dengan mengidentifikasinya di deskriptor penerapan aplikasi dan menetapkan peran untuknya.

Beberapa tingkat otentikasi tersedia, mulai dari otentikasi dasar menggunakan pengenal dan kata sandi hingga otentikasi canggih menggunakan sertifikat.

Otentikasi Berbasis Peran

Mekanisme otentikasi dalam spesifikasi servlet menggunakan teknik yang disebut role-based security. Idenya adalah bahwa daripada membatasi sumber daya di tingkat pengguna, Anda membuat peran dan membatasi sumber daya berdasarkan peran.

Anda dapat menentukan peran yang berbeda dalam file tomcat-users.xml, yang terletak di luar direktori home Tomcat di conf. Contoh file ini ditunjukkan di bawah -

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

File ini mendefinisikan pemetaan sederhana antara username, password, dan role. Perhatikan bahwa pengguna tertentu mungkin memiliki banyak peran; sebagai contoh,username = "both" adalah dalam peran "kucing jantan" dan peran "peran1".

Setelah Anda mengidentifikasi dan menentukan peran yang berbeda, pembatasan keamanan berbasis peran dapat ditempatkan pada sumber daya Aplikasi Web yang berbeda dengan menggunakan <security-constraint> elemen di web.xml file tersedia di direktori WEB-INF.

Berikut adalah contoh entri di 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>

Entri di atas berarti -

  • Permintaan HTTP GET atau POST apa pun ke URL yang cocok dengan / secure / * akan tunduk pada batasan keamanan.

  • Seseorang dengan peran sebagai manajer diberi akses ke sumber daya yang diamankan.

  • Itu login-config elemen digunakan untuk mendeskripsikan BASIC bentuk otentikasi.

Jika Anda mencoba menjelajahi URL apa pun termasuk /securitydirektori, kotak dialog berikut akan ditampilkan meminta nama pengguna dan kata sandi. Jika Anda menyediakan pengguna"admin" dan kata sandi "secret", maka Anda akan memiliki akses di URL yang cocok dengan /secured/* seperti yang telah kami tentukan sebagai admin pengguna dengan peran manajer yang diizinkan untuk mengakses sumber daya ini.

Otentikasi Berbasis Formulir

Saat Anda menggunakan metode otentikasi FORM, Anda harus menyediakan formulir login untuk meminta pengguna memasukkan nama pengguna dan kata sandi. Berikut ini adalah kode sederhanalogin.jsp. Ini membantu membuat formulir untuk tujuan yang sama -

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

Di sini Anda harus memastikan bahwa formulir login harus berisi elemen formulir bernama j_username dan j_password. Tindakan di<form> tag harus j_security_check. POSTharus digunakan sebagai metode formulir. Pada saat yang sama, Anda harus memodifikasi file<login-config> tag untuk menentukan auth-method sebagai 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>

Sekarang ketika Anda mencoba mengakses sumber daya apa pun dengan URL /secured/*, itu akan menampilkan formulir di atas yang menanyakan id pengguna dan kata sandi. Saat wadah melihat "j_security_check", ini menggunakan beberapa mekanisme internal untuk mengautentikasi pemanggil.

Jika proses masuk berhasil dan pemanggil diberi otorisasi untuk mengakses sumber daya yang diamankan, maka penampung menggunakan id sesi untuk mengidentifikasi sesi masuk untuk pemanggil sejak saat itu. Kontainer mempertahankan sesi login dengan cookie yang berisi session-id. Server mengirimkan cookie kembali ke klien, dan selama pemanggil menyajikan cookie ini dengan permintaan berikutnya, penampung akan mengetahui siapa pemanggilnya.

Jika login gagal, server mengirimkan kembali halaman yang diidentifikasi oleh pengaturan form-error-page

Sini, j_security_checkadalah tindakan yang harus ditentukan oleh aplikasi yang menggunakan login berbasis formulir untuk formulir login. Dalam bentuk yang sama, Anda juga harus memiliki kontrol input teks yang dipanggilj_username dan a password input control dipanggil j_password. Jika Anda melihat ini, berarti informasi yang ada di formulir akan dikirimkan ke server, yang akan memeriksa nama dan kata sandi. Cara melakukannya adalah untuk server tertentu.

Periksa Penerapan Realm Standar untuk memahami caranyaj_security_check bekerja untuk wadah Tomcat ..

Keamanan Terprogram di Servlet / JSP

Itu HttpServletRequest objek menyediakan metode berikut, yang dapat digunakan untuk menambang informasi keamanan saat runtime -

S.No. Metode & Deskripsi
1

String getAuthType()

Itu getAuthType() metode mengembalikan objek String yang mewakili nama skema otentikasi yang digunakan untuk melindungi Servlet.

2

boolean isUserInRole(java.lang.String role)

Itu isUserInRole() metode mengembalikan nilai boolean: true jika pengguna dalam peran yang diberikan atau false jika tidak.

3

String getProtocol()

Itu getProtocol()metode mengembalikan objek String yang mewakili protokol yang digunakan untuk mengirim permintaan. Nilai ini dapat diperiksa untuk menentukan apakah protokol aman digunakan.

4

boolean isSecure()

Itu isSecure()metode mengembalikan nilai boolean yang mewakili jika permintaan dibuat menggunakan HTTPS. Nilai true berarti itu dan koneksi aman. Nilai false berarti permintaan itu tidak.

5

Principle getUserPrinciple()

Itu getUserPrinciple() metode mengembalikan objek java.security.Principle yang berisi nama pengguna terotentikasi saat ini.

Misalnya, untuk Halaman JavaServer yang menautkan ke halaman untuk manajer, Anda mungkin memiliki kode berikut -

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

Dengan memeriksa peran pengguna dalam JSP atau servlet, Anda dapat menyesuaikan Halaman Web untuk menampilkan hanya item yang dapat dia akses kepada pengguna. Jika Anda membutuhkan nama pengguna seperti yang dimasukkan dalam formulir otentikasi, Anda dapat memanggilgetRemoteUser metode di objek permintaan.