Restful Security

Merhaba arkadaslar,

Bugün Restful Security konusuna değineceğiz. Hemen hemen her uygulamalada bir authentication ve gerekli ise authorization kullanılmaktadır. Kısaca authentication, bir kullanıcının usernmame/mail – password bilgisinin doğruluğunun kontrolünü sağlar. Kullanıcı adınız ve şifreniz doğru ise authantication oldunuz demektir. Authorization ise authantication’dan sonra gelmektedir ve login olmuş kullanıcının hangi kaynaklara erişebileceğinin kontrolünü sağlar.

Restful web servislerimiz içinde hem authantication hem de autharization işlemlerine ihtiyaç duymaktayız. Restful web servisimizi tamamıyla public yapmamalı rolller ve kısıtlamalar tanımlamalıyız.

Restful security için birkaç çözüm bulunmakla beraber en çok kullanılan yöntemi paylaşacağım. Aşağıdaki yöntemlerle restful servisimizi güvenli hale getirebiliriz;

  1. Deployment descriptior olan web.xml dosyamızda tanımlamalar yaparak.
  2. javax.ws.rs.core.SecurityContext interface’ini implemente ederek kod içerisinde bunu gerçekleştirmek.
  3. JAX-RS annotation’larını kullanarak.
  4. Jersey’in OAuth kütüphanesi kullanarak.

Yukarıdaki dört seçenekte kullanılabilmesine rağmen benim önerdiğim ve kullanıldığını gördüğüm ilk seçenek olacaktır. Nedeni ise; değişen roller, eklenen yeni rol ve silinen roller nedeniyle programsal olarak yapmak yerine dosya üzerinden bunu yapmak en doğrusu olacaktır. Yukarda belirttiğim durumlardan birinin olması durumunda müşterinize yeni xml dosyasını yollarsınız ve koda hiç bulaşmadan bunu halledebilirsiniz.

Yukarıdaki seçenekler hakkında kısa bilgiler vermekle beraber asıl Restful Security konusunnda anlatacağım tomcat ile authantication olacaktır.

Tomcat Authantication

Tomcat ile Basict authantication işlemlerini yapmak oldukça kolaydır. Http üzerinden username ve password bilgileriniz network üzerinde intercept edilebilir ve bu istenen bir durum değildir. Önerilen HTTPS(HTTP + SSL) kullanmaktır. Tomcat ile basic authantication yaparak username ve password bilgisi tomcat tarafından otomatik olarak Base64 ile encode edilerek işlem yapılacaktır. Ancak burada dikkat edilmesi gereken konu username ve passwordun encrpt olarak işlenmediğidir. Encode etmek başka encrpt etmek başkadır.

 

Tomcat ile basic authantication yaptığınızda protected olmayan url’e erişilmek istendiğinde popup ile username ve password istenir. Alınan bilgiler tomcate geri gönderilir ve tomcat-user.xml içerisinde yer alan roller ve user’lar ile match edilir. Ve duruma göre web.xml içerisinde yolu belirtilen url için authanticate olunur.

Tomcat, startup anında tomcat-user.xml içeriğini okur ve tüm application yaşam döngüsü içerinde değişmez. Herhangi bir değişiklik anında tomcatin restart edilmesi gerekir.

tomcat-user.xml dosyası your-tomcat-directory/conf/ dizinini altında bulunur ve standart bir xml dosyasıdır. Örnek bir tomcat-user.xml dosyasına bakalım;

tomcat-user.xml

Yukarıdaki xml içerisinde tomcatin match edeceği username ve password bilgileri <tomcat-user> tagleri arasına yazılır. <role> tagı ile roller belirleyip kullanıcılara atayabiliriz. Bir kullanıcı birden fazla role sahip olabilir. Yukarıdaki alican kullanıcısı hem user hem de superadmin olarak belirlenmiş. Altında yer alan akkus kullanıcısına ise user olarak role verilmiş.

Şimdi web.xml içerinde yapacağımız tanımlamalara bakalım;

web.xml

Yukarida web.xml içerisindeki tanımlara bir bakalım;

  • <security-constraint> ile her url için bir güvenlik planı oluşturulur. Tüm .jsp uzantılı ve tüm url’ler için güvenlik tanımı yapıyoruz.
  • <web-resource-collection> ile bir url tanımı ve url üzerinde yapılmasına izin verilen HTTP methodlarına yer veriyoruz.
  • <auth-constraint> ile tomcat-user.xml içerisinde yazdığımız rollerin bu web resource collection içerindeki url’de bulunan kaynağa erişebileceğini belirtiyoruz.
  • <security-role> ile ilk adımda tanımlanman rolleri eşleştiriyoruz.
  • <user-data-constraint> ile client ve server arasında nasıl iletişim kurulacağını belirliyoruz. NONE, INTEGRAL ve CONFIDENTIAL seçeneklerini kullanabiliriz. Şimdilik none ile birşey belirtmiyoruz.
  • <login-config> ile authantication tipini belirtiyoruz. Burada da BASIC ile , FORM ile ve CLIENT-CERT ile auth methodunu belirtebiliriz. Şimdilik basic ile Base64 ile authantication yapacağız.
  • Roller için filter tanımlamamız gerekiyor jersey için. Hangi rollere açık olduğunu buradan anlayacaktır.

 

Uygulamamızı tomcat üzerinde deploy edelim ve /test url’ine gidelim. Tarayıcıdan http://localhost:8080/TomcatAuth/test adresine erişmek istediğimizde tomcat bu url’in bir protected url olduğunu ve login olunup olunmadığını kontrol edicektir. Basic auth olduğumuz için popup ile username-password bilgisini isteyecektir bizden. tomcat-user.xml içerisinde belirttiğimiz userlardan birini girip basic auth olabiliriz. Restful classımıza bakalım;

Çok kısa olan rest servisimizdeki annotationlara bakalım;

  • @DeclaresRoles ile tomcat-user.xml de bulunan rollerin authanticate olduktan sonra bu kaynağa erişebileceğini belirtiyoruz.
  • @RolesAllowed ile yukarda declare ettiğimiz rolleri ezebiliriz. Class level olan superadmin ve user rolleri rest class’ı içerisindeki tüm methodlara erişebilir. RolesAllowed ile application versiyonunu döndüren methoda sadece superadmin rolüne sahip kullanıcıların girmesine izin veriyoruz.

Tarayıcıya rest servisine gidecek olan url’i yazalım;

Selection_014

 

İlgili url’e erişilmek istendiğinde tomcat bunun güvenli bir kaynak olduğunu ve tomcat-user.xml içerisindeki bir kullanıyla match edeceğini anlar. Kullanıcı olarak “alican” ve şifre olarak “caysever” girdiğimizde authanticate olmus olacağız. Şöyle ki;

Selection_015

Not : İlk resimde http 403 hatası almamızın nedeni web.xml içerisinde login tipini eksik yazmamdan kaynaklandı. Aklınızı karıştırmasın.

Aynı kaynağa sadece user role sahip diğer kullanıcı ile erişmek istediğimizde Http 403 hatası alacağız.
Selection_017

Selection_018

 

Şimdi de test servletimize bakalım ve authanticate olan user’ın encode edilmis bilgilerini görelim. Authanticate bilgileri header içerisinde yer almaktadır.

Selection_016

Encode edilen username password “YWxp..” ile başlayan değerdir.

Yukarıda login config olarak basic seçmiştik. Şimdi kendi login page sayfamızı oluşturalım;

 

Jsp sayfamızda dikkat etmemiz gereken noktalar form’un action kısmı ve j_username_id ile j_password_id bilgilerini yazmak olacaktır. Authanticate methodumuzu web.xml içerisinde güncelleyelim;

Auth methodumuz form ve login, login-error safyamızı belirtiyoruz. Ben aynı page yaptım. Jsp sayfasına err=1 parametresi gelirse username ve passwordu check et diye bilgi yazdırıyorum.

Selection_019

 

User bilgilerini yanlıs girdigimde tomcat /login.jsp sayfasına err=1 request parametresini ekleyerek yönlendiriyor. Jsp sayfasında da request param err kontrolü yapıyoruz. Doğrusunu yazalım şimdi;

Selection_020

Login olduktan sonra rest kaynaklarını görebiliriz.

Yazımı burada sonlandırıyorum arkadaslar.

İlgili projeye ve tomcat configlere buradan ulaşabilirsiniz : Tomcat Auth 

Bir sonraki yazıda görüşmek dileğiyle. Mutlu kalın, kod’la kalın ve bol bol Çay için

 

~ Alican Akkus

1088 Total Views 1 Views Today