Servlet’lerde kimlik denetimi

Servletlerde kimlik denetimi 4 yolla yapılabiliyor :

  1. HTTP BASIC AUTHENTICATION :

    Http 1.0’da tanımlandı. En kolay ve en çok kullanılan yöntem. Tarayıcı üzerinden korumalı bir kaynağa istek geldiği zaman, sunucu kullanıcı adı ve parola sorar. En başta tarayıcı korumalı bir kaynağa istek yaptığını bilmez. Normal HTTP isteği gönderir. Sunucu kaynağın korumalı olduğunu anlayınca “401 unauthorized” mesajını istemciye döndürür. Mesajın header bilgisinde basic authentication gerektiği bilgisi yazar. Hangi authentication’ın gerekli olduğu bilgisi realm’de yazar. (web.xml’deki bir bilgi)

Kullanımı:

  • İlk olarak url-pattern’da tanımlı olan kaynaklara erişim kısıtlaması olduğunu belirtiyoruz.
[codesyntax lang="php" lines="no"]
<web-resource-collection>
  <web-resource-name>SecurePages</web-resource-name>
  <description>Security constraint /secure</description>
  <url-pattern>/secure/*</url-pattern>
  <http-method>POST</http-method>
  <http-method>GET</http-method>
</web-resource-collection>
[/codesyntax]

Context path’de secure dizini altındaki kaynaklara GET ve POST methodları ile erişimin kısıtlı olduğunu tanımladık.

  • Sonra bu kaynaklara kimlerin erişebileceğini yani hangi role sahip kullanıcıların erişebileceğini tanımlıyoruz.
[codesyntax lang="xml" lines="no"]
<auth-constraint>
 <description>only let the admin users login</description>
 <role-name>admin</role-name>
</auth-constraint>
[/codesyntax]

Admin rolündeki tüm kullanıcıların bu sayfalara erişebileceği söylendi.

  • Daha sonra güvenli roller <security-role> taginde tanımlanır.
[codesyntax lang="xml" lines="no"]
<security-role>
  <description>The Only Secure Role</description>
  <role-name>admin</role-name>
</security-role>
[/codesyntax]

Son olarak da tomcat için tomcat-users.xml dosyasında roller ve bu rollere ait kullanıcılar belirlenir.

[box type=”info”] Her uygulama sunucusunda farklı şekilde belirtiliyor.[/box]

Avantajları : Kurması çok kolaydır ve tüm tarayıcılar tarafından desteklenir.

Dezavantajları : Kullanıcı adı ve parola şifrelenmemiştir. Kullanıcı adı ve parola soran dialog kutusunun görünümünü değiştiremeyiz.

2. HTTP DIGEST AUTHENTICATION :

Basic authentication ile aynı mantıkla çalışıyor. Bunda parola şifrelenerek gönderiliyor.

Avantajları : Basicten daha güvenli bir yöntemdir.

Dezavantajları : Sadece belli başlı tarayıcılar tarafından destekleniyor. Birçok servlet container tarafından desteklenmeyebilir.

3. HTTPS CLIENT AUTHENTICATION :

HTTP üzerinde SSL kullanılmış halidir. SSL (Secure Socket Layer) Netscape tarafından geliştirilmiş internette güvenli veri transferi yapmaya yarayan bir protokoldür.  Secure Sockets Layer (SSL) veri şifreleme, server authentication, mesaj bütünlüğü, TCP/IP bağlantılarında istemci authentication’ı destekler. Tarayıcı yani client ile server arasındaki bağlantı kurulduğunda authentication sağlanmış olur. Bütün veri public key yöntemiyle şifrelenir.

Avantajları : 4 yöntem arasındaki en güvenli olanıdır. Neredeyse tüm tarayıcılar tarafından desteklenir.

Dezavantajları : VeriSign gibi herhangi bir certification authority tarafından sertifika ister. Implemente etmek ve yürürlükte kalmasını sağlamak çok kolay değildir.

4. FORM-BASED AUTHENTICATION : 

Bu da Basic Authentication’a benzer. Yalnız tarayıcının pop-up dialog kutusunu kullanmak yerine html form kullanır.

Avantajları : Kurması çok kolay ve istediğimiz şekilde uyarı penceresi dizayn edebiliyoruz. Bütün tarayıcılar tarafından da destekleniyor.

Dezavantajları : Kullanıcı adı ve parola şifrelenmedği için pek de güvenli değil.

  • İlk önce web container’a Form Authentication’ı kullanmak istediğimizi söylüyoruz.
[codesyntax lang="xml" lines="no"]
<login-config>
  <auth-method>FORM</auth-method>
  <form-login-config>
    <form-login-page>/LoginForm.html</form-login-page>
    <form-error-page>/LoginError.html</form-error-page>
  </form-login-config>
</login-config>
[/codesyntax]

[box] Diğer yerler aynı.[/box]

İstersek

[codesyntax lang="xml" lines="no"]
<user-data-constraint>
  <description>SSL not required</description>
  <transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
[/codesyntax]

Tagini kullanarak veri transferinin nasıl yapılmasını istediğimizi belirtebiliriz.

3 seçeneğimiz var :

Transport Description
NONE Şifrelemeye gerek yok. HTTP yeterli.
CONFIDENTIAL Veri şifrelenmelidir. (SSL gibi)
INTEGRAL Verinin transferi sırasında değerinin korunması gerekir. Birçok sunucu SSL kullanır. Şifreleme gerekmediğinden bazı hashing algoritmaları kullanılabilir.

NONE’da veri transferinde bütünlük ve güvenilirlik garantisi verilmez. http üzerinden istek gönderilir.

INTEGRAL ve CONFIDENTAL’da ise bütünlük ve güvenilirlik garantisi verilir.