m i.c o
dil
Spring için
ww w. ja
va
Acegi Güvenlik Sistemi
Hazırlayan : Akif Burak Tosun Hacettepe Universitesi - 20221925
İletişim:
[email protected]
1
m
İçindekiler: Önsöz
1.1.
Giriş
1.2.
Güncel Durum
1.3.
Üst Düzeyli Tasarım
i.c o
Bölüm 1: Güvenlik
Anahtar Bileşenler
1.3.2.
Desteklenen Güvenli Nesneler
1.3.3.
Kurulum Nitelikleri
1.4. İstem Bağlamları 1.4.1. Tarihsel Gelişim 1.4.2. SecurityContext
dil
1.3.1.
va
1.5. Kimlik Denetimi (Authentication) 1.5.1. Kimlik Denetim İstemleri 1.6. Yetki Protokolü (Authorization) 1.6.1. Verilen Yetkiler
ww w. ja
1.6.2. Erişim Kararları Yönetimi
Bölüm 2 : Neden ve Nasıl Acegi? 2.1. J2EE’de CMA
2.1.1. Temel Kimlik Denetimi
2.1.2. Form Tabanlı Kimlik Denetimi
2.2. Tomcat Alanları
2.3. CMA’daki Problemler
2.4. Çözüm: Acegi Güvenlik
2.5. Acegi Güvenlik Ayarları,
2.5.1. “web.xml” ayarları
2.5.2. “appContext~security.xml” ayarları 2
2.5.3. Temel Kimlik Denetimi
2.5.5. Form Tabanlı Kimlik Denetimi
m
2.5.4. Güvenli HTTP İstemi
2.5.7. Parola Şifreleme 2.5.8. JDBC Sağlayıcısı 2.5.9. SQL Uyarlama
i.c o
2.5.6. KimlikDenetim Sağlayıcıları (Authentication Providers)
2.5.10. Metotları Rollerle Güvelik Altına Alma 2.6. Diğer Özellikler
ww w. ja
va
dil
2.7. J2EE vs. Acegi Güvenlik Sistemi
3
m
Spring için Acegi Güvenlik Sistemi (AGS)
i.c o
Önsöz
Bu doküman, Spring çatısının getirdiği kimlik denetimi ve yetki
protokolünü sağlayan sınıfları içeren Acegi Güvenlik Sistemi(AGS)’ne referans
Bölüm 1 : Güvenlik
va
1.1.Giriş
dil
veren rehberlik sağlamaktadır.
Acegi Güvenlik Sistemi , Spring destekli projeler için kimlik denetimi ve yetki protokolünü popüler “web container (kap)”lar aracılığıyla sağlayan
ww w. ja
sistemdir. Bu güvenlik mimarisi “The Spring Way” gelişiminin üstüne kurulmuş olup ; bağlamlarını, kesiştiricileri ve arabirim sürücülerini programlamayı kapsamaktadır. Sonuç olarak “Spring için Acegi Güvenlik Sistemi” Spring tabanlı yazılımların güvenliği için aranan ve kompleks mimarilere kolayca uyum sağlayabilen bir sistemdir.
Güvenlik iki belirgin işlemi içermektedir , kimlik denetimi
(authentication) ve yetki protokolü (authorization). Kimlik denetiminin yaptığı , ziyaretçinin iddia edilen kişi olup olmadığını çözümlemektir. Öte yandan yetki
protokolünün ilgilendiği ise kimlik denetimi yapılmış bir ziyaretçinin yapmakta
olduğu işlemi yapıp yapamayacağının
4
Spring için AGS’de başından sonuna kadar kimlik denetimi yapılacak
m
olan “kullanıcı, sistem veya gereç” temel olarak ele alınır. Bu güvenlik mimarisinde “roller ya da gruplar” diye- önceki uygulamalardan alışkın
Güvenlik tarafından sağlanmıştır.
1.2.Güncel Durum
i.c o
olduğunuz- bir kavram bulunmamasına karşın eşdeğer işlevsellik Acegi
Spring için Acegi Güvenlik Sistemi , Spring Topluluğu tarafından yaygın olarak kullanılmaktadır. Uygulama Programı Arabirimleri (API) durağan olarak
dil
ele alınır ve sadece önemsenmeyecek kadar küçük değişiklikler beklenir. Daha önce de söylenildiği gibi , diğer projelerde de yapılan “geriye uyumluluk ve gelişim” arasındaki dengeyi tutturmak zorundayız. Yürürlülükteki versiyon 0.6.1.’da , Acegi Güvenlik “Apache Taşınabilir Runtime Projesi”nin uyarlanan
va
kılavuzunu kullanmaktadır. Bu kılavuza şu adresten ulaşabilirsiniz : http://apr.apache.org/versioning.html Yayınlanacak versiyon 1.0.0. için öncelikli küçük geliştirmeler – her birinin ekstra işlevselliği olmasına rağmen projenin temel arayüzleri ve sınıfları
ww w. ja
değiştirmeyecektir - şimdiden planlandı. Bu sebeple Spring için Acegi Güvenlik Sistemi’nin kullanıcıları şu anki versiyonu gelecekte de rahatlıkla kullanabileceklerdir.
1.3. Üst Düzeyli Tasarım
1.3.1. Anahtar Bileşenler
Çoğu şirket uygulamalarının dört temel güvenlik gereksinimi vardır. İlk
olarak bir tekil kişiyi tanımlayabilmeleri gerekir. İkincil olarak web istemlerini güvenli hale getirebilmeleri gerekir. Üç , şirket uygulamaları servis katmanı metotlarının güvenliğini sağlayabilmelidir. Son olarak , çok nadir de olsa şirket
5
uygulamaları etki alanındaki örnek nesnelerin de güvenliğini sağlamalıdır.
içine alan geniş bir çatıda sağlayabilmektedir.
m
Acegi Güvenlik , bu dört temel şirket uygulaması gereksinimlerini ortak olarak
-
i.c o
Spring için AGS esasen 8 temel işlevsel kısımdan oluşmaktadır:
“Authentication” (kimlik denetim) nesnesi: Bu nesne tekil kişiyi , ve bu kişinin otoriteler tarafında verilen güven belgesini ve kimlik belgesini içerir. Ayrıca bu nesne kimlik denetimine ilişkin (kaynağın TCP/IP adresi
dil
gibi) ek bilgiler de tutabilir.
- “ContextHolder” (bağlamı tutan) : Authentication nesnesini bir ThreadLocal’de (yükümlü nesne) tutar.
- “AuthenticationManager” : ContextHolder aracılığıyla sunulan
va
Authentication nesnesini denetler.
- “AccessDecisionManager” : Verilen bir işlemi onaylar. - “RunAsManager” : Verilen bir iş işletilirken isteğe bağlı olarak Authentication nesnesinin yerini değiştirir.
ww w. ja
- “Güvenli Nesne” kesiştirici (interceptor) : İşletimin ele alınması ve verilen bir işin işletilmesinden sonra ; kimlik denetimini , yetki protokolünü ve işletme yenilenmesini koordine eder.
- “AfterInvocationManager” : “Güvenli Nesne” kesiştirici’den dönen bir nesneyi düzenleyebilir; bu işlemi, tekil şahısın erişim yetkisi olmayan Collection’larını silerek yapar.
- Erişim Denetim Listesi yönetim paketi : Erişim denetim listelerinin etki alanındaki örnek nesnelere uygun olup olmadığını denetler.
6
“Güvenli Nesne” kesiştirici, Acegi Güvenlik’in çoğu anahtar sınıfını
m
işletir ve aynı zamanda çatının (framework) en önemli özniteliklerini dağıtır. Bunun önemini belirtmek için Şekil-1’de anahtar ilişkilerini ve
va
dil
i.c o
AbstractSecurityInterceptor ’ın somut uygulamaları belirtilmiştir.
ww w. ja
Şekil 1: “Güvenli Nesne” Modeli
Her “Güvenli nesne” kesiştiricisi (gelecekte “güvenlik kesiştiricisi” olarak
kullanılacaktır) belirli bir “güvenli nesne” türüyle birlikte çalışır. Peki güvenli nesne nedir? Güvenli nesneler üzerilerine güvenlik uygulanabilen nesnelerdir. Bir güvenli nesne bazı geri çağrım biçimlerini sağlamalıdır böylece güvenlik kesiştiricisi yapması gerekenleri saydam bir şekilde gerçekleştirir ve zamanı geldiğinde istenilen işlemi yapması için ilgili nesneyi geri çağırır. Eğer güvenli nesneler yerel olarak geri çağırma yaklaşımını sağlamıyorsa bir sargı (wrapper) yazılması gerekir ve bu sayede işlem gerçekleştirilir.
7
Her güvenli nesne net.sf.acegisecurity.intercept altında
Böylece sunulan her tür güvenli nesneyi destekler.
m
kendi paketine sahiptir. Diğer bütün paketler güvenli nesneden bağımsızdır.
Sadece durdurma ve yetkilendirme istemleri için tamamen yeni bir yol
i.c o
tasarlamak isteyen yazılımcılar güvenli nesneleri direkt olarak kullanmalıdır. Örneğin ; MethodInvocations nesnesini kullanmayan mesajlaşma sistemine yapılan çağrıları güvenli kılmak için yeni bir güvenli nesne
oluşturulabilir. Çoğu Spring uygulaması günümüzde desteklenen üç temel güvenli nesne türünü (AOP Alliance MethodInvocation, AspectJ
dil
JoinPoint ve web istemi FilterInterceptor) şeffaflıkla kullanmaktadır.
Yukarıda belirtilen Acegi Güvenlik için gerekli olan sekiz anahtar
va
kısım’ın önemli olanları bu dokümanda ele alınacaktır. 1.3.2. Desteklenen Güvenli Nesneler
Şekil-1’in tabanında da görüldüğü gibi Spring için Acegi Güvenlik Sistemi günümüzde üç güvenli nesneyi desteklemektedir.
ww w. ja
İlki AOP Alliance MethodInvocation’ı içermektedir. Bu Spring
bean’lerini korumak için var olan güvenli nesne türüdür. Yazılım geliştiriciler
genellikle bu güvenli nesne türünü şirketsel nesneleri korumak için kullanırlar.
Standart bir Spring-tabanlı bean’i MethodInvocation gibi geçerli kılmak için , bean basitçe bir ProxyFactoryBean veya
BeanNameAutoProxyCreator veya DefaultAdvisorAutoProxyCreator tarafından yayınlanır. Çoğu Spring geliştiricisi kendi işlembilgilerinde veya diğer Spring alanlarında bu duruma alışkın hale gelmiştir.
İkinci tür AspectJ JoinPoint’ı içerir. AspectJ; genellikle Spring bean
kabının dışında yönetilmesiyle birlikte , etki alanındaki örnek nesnelerin
8
güvenliğini sağlamada tek yol olarak kullanılır. AspectJ kullanarak “new
m
Person();” gibi standart mimariler kullanılabilir ve tüm güvenlik Acegi
Güvenlik tarafından sağlanabilir. Tekil durumu yaratıp, uygun kimlik denetim yöneticisine, erişim kararları yöneticisine ve ilgili diğer alanlara ileten
i.c o
AspectJSecurityInterceptor ise hala Spring tarafından yönetilmektedir.
Üçüncü ve son tür FilterInvocation’dır. Spring için Acegi Güvenli Sistemi’nin içerdiği bir nesnedir. İçerdeki bir süzgeç tarafından yaratılır ve HTTP ServletRequest, ServletResponse ve FilterChain’ı sarar.
dil
FilterInvocation, HTTP kaynaklarının korunmasını sağlar. Yazılım geliştiriciler genellikle bu sistemin hangi mekaniklerle çalıştığını anlamak zorunda değildir çünkü sadece güvenlik süzgeçlerini web.xml’e eklerler ve
va
geri kalan işi güvenlik sistemi halleder. 1.3.3. Kurulum nitelikleri
Her güvenli nesne sonsuz sayıda bireysel istemi temsil edebilir. Örneğin ,
ww w. ja
bir MethodInvocation herhangi bir metodu herhangi argümanlarla çağrılmasını temsil edebilir, aynı zamanda FilterInvocation da
herhangi bir HTTP URL’sini temsil edebilir. Spring için Acegi Güvenlik Sistemi, olası her istem için uygulanan
kurulumları kaydetmek zorundadır. BankManager.getBalance(int accountNumber) istemi için gerekli güvenlik kurulumu ile, BankManager.approveLoan(int applicationNumber) istemi için gerekli güvenlik kurulumundan çok farklı olmalıdır. Daha basit ele alırsak ; http://some.bank.com/index.htm sayfasına yapılan bir istem için
gerekli güvenlik kurulumuyla ,
http://some.bank.com/manage/timesheet.jsp sayfasına yapılan
bir istem için gerekli güvenlik kurulumu birbirinden farklı olmalıdır.
9
Farklı istemlerle alakalı çeşitli güvenlik kurulumlarını saklamak için
ConfigAttribute arayüzü tarafından simgelenir.
m
kurulum niteliği kullanılır. Gerçekleştirim katmanında bir kurulum niteliği
Alakalı istem ile ilişkilendirilmiş ConfigAttribute’lar yığını bir
i.c o
ConfigAttributeDefinition içerisinde tutulur. Bu somut sınıf sadece ConfigAttribute’ları tutar bunun dışında başka bir iş yapmaz.
Güvenlik kesiştiricisine bir istem geldiğinde, hangi güvenlik kurulumunun uygulanacağını belirlemek zorundadır. Başka bir deyişle , isteme uygulanan ConfigAttributeDefinition’ı bulmak zorundadır. Bu karar
dil
ObjectDefinitionSource arayüzü tarafından ele alınır. Bu arayüz tarafından sağlanan ana metot “public ConfigAttributeDefinition getAttributes(Object object)” metodudur. Buradaki Object güvenli nesnedir. Güvenli nesne geri çağrıldığında isteme dair detayları taşır
va
böylece “ObjectDefinitionSource gerçekleştirimi” kendisi için gerekli olan detayları ConfigAttributeDefinition içeriğine bakarak bulabilir.
ww w. ja
1.4. İstem Bağlamları 1.4.1. Tarihsel Gelişim
0.9.0. sürümünden önceki sürümlerde oturumlar arası bağlamları
saklamak için Acegi Güvenlik bir ContextHolder kullanıyordu. Context sınıfına ilişkin bir alt sınıf olan SecureContext tanımlanıyordu ki bu Authentication nesnesini taşımak için bir arayüzü oluşturuyordu. Bu kavram Spring geliştiricileri tarafından uzun tartışmalar sonucu kararlılığı sağlamak adına 0.9.0 sürümünde kaldırılmıştır. Tartışma örneğini incelemek için bağlantıyı izlemeniz yeterlidir:
http://article.gmane.org/gmane.comp.java.springframew
ork.devel/8290
10
1.4.2. SecurityContext (SecureContext)
m
SecurityContext’leri saklamak için Acegi Güvenlik Sistemi SecurityContextHolder kullanır. SecurityContext nesnesi bir tek
i.c o
Authentication get/set metotları içerir.
1.5. Kimlik Denetimi (Authentication) 1.5.1. Kimlik Denetim İstemleri
İstemci kendi güvenlik kimliğini Acegi Güvenliğe sunmak için kodunda
dil
bir yola ihtiyaç duyar. Bu Authentication arayüzünün görevidir.
Authentication arayüzü üç önemli nesneyi tutar : tekil kişi (istemcinin kimliği), kimlik belgesi (istemcinin kimliğinin kanıtı, örneğin parola) ve bu tekil kişiye verilen yetkiler. Tekil kişiye verilen yetkiler
va
AuthenticationManager tarafından yerleştirilirken , Tekil kişi ve bu
ww w. ja
kişiye ait kimlik belgesi istemci kodu tarafından yerleştirilir.
11
m i.c o dil
va
Şekil 2: Anahtar Kimlik Denetim Mimarisi Şekil-2’de görüldüğü üzere Spring için Acegi Güvenlik Sistemi birkaç somut Authetication gerçekleştirimi içerir:
ww w. ja
! UsernamePasswordAuthenticationToken, kullanıcı adı ve parolanın sırasıyla tekil kişi ve kimlik belgesi olarak kabul edilmesini
sağlar. Bu ayrıca HTTP Oturum Kimlik Denetim sistemi tarafından yaratılır.
! TestingAuthenticationToken, kimlik denetimi yapılmış bir nesnenin kendisine ilişkilendirilmiş AthenticationProvider olarak kabul edilmesi ve bunun test edilmesini kolaylaştırır.
Bir tekil kişiye yüklenen yetkiler GrantedAuthority arayüzü
tarafından belirtilir. Bu arayüz yetki protokolü (authorization) bölümünde ele alınır.
12
m
1.6. Yetki Protokolü (Authorization) 1.6.1. Verilen Yetkiler
Kimlik denetimi bölümünde de anlatıldığı gibi tüm Athentication
i.c o
gerçekleştirimlerinde GrantedAuthority nesnelerini saklayacak bir diziye ihtiyaç duyulur. Bu nesneler tekil kişiye verilmiş yetkileri betimlemeye yarar. GrantedAuthority nesneleri Athentication içerisine
AthenticationManager tarafından yerleştirilir , daha sonra da
AccessDecisionManager tarafından yetki kontrolü yapılırken okunur.
dil
GrantedAuthority tek bir metodu olan bir arayüzdür:
va
public String getAuthority();
Bu metot AccessDecisionManager‘a , GrantedAuthority‘nin kesin bir String betimlemesini elde etmesi kolaylığını sağlar. Böylelikle bu String tabanlı GrantedAuthority nesnesinin betimlemeleri herhangi bir
ww w. ja
AccessDecisionManager tarafından kolaylıkla okunabilir. Eğer bir GrantedAuthority nesnesi String olarak kesin bir
betimlemeye dönüştürülemiyorsa “kompleks” olarak düşünülür ve getAuthority() null döndürür.
Bu kompleks durumu engellemek için Acegi Güvenlik Sisteminde tek bir
kesin GrantedAuthority String betimlemesine izin verir. Bu sayede kullanıcı tarafından belirlenmiş tüm String betimlemeleri bir GrantedAuthority nesnesine dönüştürülebilir.
13
1.6.2. Erişim Kararları Yönetimi
m
AccessDecisionManager son erişim kontrol kararlarını almadan sorumludur. Bu arayüz üç metot içerir:
i.c o
public void decide(Authentication authentication, Object object, ConfigAttributeDefinition config) throws AccessDeniedException;
dil
public boolean supports(ConfigAttribute attribute);
public boolean supports(Class clazz);
İlk metottan da görülebileceği gibi yetkilendirme kararını alırken tüm
va
ilgili veriler AccessDecisionManager ‘ın elinden geçer. Buradaki güvenli nesne geçişi , denetlenecek asıl güvenli nesnenin argümanlarını geçerli kılar. Örneğin , diyelim ki güvenli nesnemiz MethodInvocation. Herhangi bir
ww w. ja
Customer argümanı için MethodInvocation’ı sorgulamak daha kolay olacaktır, sonra tekil kişinin Customer üzerindeki ilgili işlemi yapma izni olup olmadığını bazı güvenlik mantıklarını gerçekleştirme işi AccessDecisionManager tarafından yapılır. Eğer erişim hakkı yoksa AccessDeniedException aykırı durumu gerçekleştirim tarafından
fırlatılır.
14
m
Bölüm 2 : Neden ve Nasıl Acegi?
i.c o
2.1. J2EE’de CMA
! CMA (Container Managed Authentication), Servlet API üzerine kurulmuştur.
security-constraints (güvenlik kısıtlamaları) , web.xml
dil
!
içerisinde yapılandırılır. !
Kimlik denetim alanı yapılandırması , uygulama sunucusu
va
içerisinde yapılır.
2.1.1. Temel Kimlik Denetimi
ww w. ja
<security-constraint>
<web-resource-collection>
<web-resource-name>Güvenli Alan
/*
*
TEMEL Güvenli Bölge
15
m
2.1.2. Form Tabanlı Kimlik Denetimi ! /WEB-INF/web.xml: <security-constraint>
i.c o
<web-resource-collection>
<web-resource-name>Güvenli Alan
*.html
*
dil
FORM
va
/login.jsp /loginError.jsp
ww w. ja
! /login.jsp
16
! /loginError.jsp
m
Giriş Hatalı - lütfen yeniden deneyin.
i.c o
2.2. Tomcat Alanları (Tomcat Realms)
JNDIRealm ! JDBCRealm Örneği:
dil
! MemoryRealm , JDBCRealm , DataSourceRealm , JAASRealm,
va
ww w. ja
debug="99" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/ equinox?autoReconnect=true"
connectionName="root" connectionPassword="" userTable="users" userNameCol="username" userCredCol="password"
userRoleTable="user_roles" roleNameCol="rolename"/>
17
m
2.3. CMA’daki problemler ! Düşünüldüğü gibi portatif değildir
i.c o
! Bütün servlet kapları(container) JDBCRealm’le taşınamaz ! Form tabanlı kimlik denetimi sorunları:
1. Çoğu zaman kullanıcı/rol sorgularını SQL ile kontrol edemeyiz 2. Kullanıcının ilk login olduğu anı /j_security_check üzerinde
dil
filtreleyerek yakalama imkanımız yok
3. Gerçekleştirimi farklı sunucularda değişir.
va
2.4. Çözüm : Acegi Güvenlik
! Herşey kendi uygulamamız içerisinde ayarlanabilir ! URL’lerin güvenliğini her zamanki ifadelerle oluşturulan rollerle
ww w. ja
sağlayabiliriz.
! URL örüntüleri her zamanki ifadelerle veya Ant-türü örüntülerle olabilir (örneğin : /**/admin*.html)
! Desteklediği kimlik denetim yöntemleri : Basic, Digest, Form, Yale Central Authentication System(CAS)
! Kimlik denetim sağlayıcıları (Authentication providers) : JDBC , XML, LDAP , CAS
18
m
2.5. Acegi Güvenlik Ayarlamaları
2.5.1. “web.xml” ayarları
i.c o
securityFilter
net.sf.acegisecurity.util.FilterToBeanProxy
<param-value>
dil
<param-name>targetClass
net.sf.acegisecurity.util.FilterChainProxy
va
securityFilter /*
ww w. ja
2.5.2. “appContext~security.xml” ayarları
! filterChainProxy bean : Kimlik denetimi işlemi için gerekli süzgeçler(filter) listesini içerir. Bu süzgeçler aşağıdaki spesifik görevleri gerçekleştirir :
o httpSessionContextIntegrationFilter: Bu süzgeç kullanıcının kimlik denetimini ContextHolder
içerisinde saklamak için
kullanıcının açtığı oturumla iletişim kurmakla sorumludur.
19
kimlik denetimi başlıklarını işleme koyar
ve sonuçlarını
i.c o
ContextHolder’ın içine yerleştirir.
m
o basicProcessingFilter: Bu süzgeç bir HTTP isteminin temel
o securityEnforcementFilter: Bu süzgeç istemleri, kullanıcıların hangi URL’lere gitme izni olduğunu belirleyen FilterSecurityInterceptor’a iletir
dil
class="net.sf.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource">
va
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT
/j_security_check*=
ww w. ja
httpSessionContextIntegrationFilter, authenticationProcessingFilter
/*.html*=httpSessionContextIntegrationFilter, remoteUserFilter,anonymousProcessingFilter, securityEnforcementFilter
/*.jsp=httpSessionContextIntegrationFilter, remoteUserFilter
20
m
2.5.3. Temel Kimlik Denetimi
<property name="providers"> <list>
i.c o
class="net.sf.acegisecurity.providers.ProviderManager">
dil
class="net.sf.acegisecurity.providers.dao.memory. InMemoryDaoImpl">
va
<property name="userMap" value="tomcat=tomcat,ROLE_USER"/>
ww w. ja
class="net.sf.acegisecurity.providers.dao. DaoAuthenticationProvider"> <property name="authenticationDao" ref="inMemoryDaoImpl"/>
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint"/>
21
m
class="net.sf.acegisecurity.ui.basicauth. BasicProcessingFilterEntryPoint">
<property name="realmName" value="ProtectedArea"/>
i.c o
2.5.4. Güvenli HTTP İstemi
dil
class="net.sf.acegisecurity.context.
HttpSessionContextIntegrationFilter"> <property name="context"
value="net.sf.acegisecurity.context.security.
va
SecureContextImpl"/>
class="net.sf.acegisecurity.intercept.web. SecurityEnforcementFilter">
ww w. ja
<property name="filterSecurityInterceptor" ref="filterInvocationInterceptor"/>
<property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint"/>
<property name="allowIfAllAbstainDecisions" value="false"/>
<property name="decisionVoters"> <list>
22
m
class="net.sf.acegisecurity.intercept.web.
i.c o
FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager"
ref="httpRequestAccessDecisionManager"/> <property name="objectDefinitionSource">
dil
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /*.html*=ROLE_USER
ww w. ja
va
/*.jsp=ROLE_USER
2.5.5. Form Tabanlı Kimlik Denetimi
! Temel kimlik denetiminden , form tabanlı kimlik denetimine geçiş için sadece XML konfigürasyonu yeterlidir.
! Login ve LoginError sayfaları CMA’daki gibi olabilir ! “Beni Hatırla” ve “Parola Şifreleme” gibi işlemler için kod gerekmez – sadece xml.
23
2.5.6. Kimlik Denetimi Sağlayıcıları (Authentication Providers)
m
i.c o
<property name="authenticationDao" ref="inMemoryDaoImpl"/>
class="net.sf.acegisecurity.providers.dao.memory. InMemoryDaoImpl"> <property name="userMap">
dil
tomcat=tomcat,ROLE_USER
springlive=springlive,ROLE_USER
va
2.5.7. Parola Şifreleme
ww w. ja
class="net.sf.acegisecurity.providers.dao.memory. InMemoryDaoImpl">
<property name="userMap">
tomcat=536c0b339345616c1b33caf454454d8b8a190d6c, ROLE_USER
springlive=2a9152cff1d25b5bbaa3e5fbc7acdc6905c9f251, ROLE_USER
24
m
class="net.sf.acegisecurity.providers.dao. DaoAuthenticationProvider">
<property name="authenticationDao" ref="inMemoryDaoImpl"/>
i.c o
<property name="passwordEncoder" ref="passwordEncoder"/>
class="net.sf.acegisecurity.providers.encoding. ShaPasswordEncoder"/>
dil
2.5.8. JDBC Sağlayıcısı
! JDBC kullanabilmek için dataSource’a bağımlı bir bean tanımlamamız
va
yeterlidir:
class="net.sf.acegisecurity.providers.dao.jdbc. JdbcDaoImpl">
ww w. ja
<property name="dataSource" ref="dataSource"/>
! Kullanıcı ve rollerini seçebilmemiz için varsayılan SQL cümlecikleri:
"SELECT username,password,enabled FROM users WHERE username = ?";
"SELECT username,authority FROM authorities WHERE username = ?";
25
m
2.5.9. SQL Uyarlama ! SQL’i yeniden yazmak için usersByUsernameQuery ve
i.c o
authoritiesByUsernameQuery özelliklerini belirlememiz gerekir:
class="net.sf.acegisecurity.providers.dao.jdbc. JdbcDaoImpl">
<property name="dataSource" ref="dataSource"/> <property name="usersByUsernameQuery">
dil
SELECT username,password,enabled as 'true' FROM users WHERE username = ?
<property name="authoritiesByUsernameQuery">
SELECT username,rolename FROM user_roles
va
WHERE username = ?
<property name="passwordEncoder" ref="passwordEncoder"/>
ww w. ja
26
m
2.5.10. Metotları Rollerle Güvelik Altına Alma
class="net.sf.acegisecurity.intercept.method.aopalliance.
i.c o
MethodSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="accessDecisionManager"/>
<property name="objectDefinitionSource">
dil
org.appfuse.service.UserManager.getUser=ROLE_ADMIN org.appfuse.service.UserManager.getUsers=ROLE_USER org.appfuse.service.UserManager.removeUser=ROLE_ADMIN
...
va
org.appfuse.service.UserManager.saveUser=ROLE_ADMIN
ww w. ja
<property name="target">
<property name="preInterceptors"> <list>
27
m
2.6. Diğer Özellikler ! Access Control Lists (ACLs) : Her nesne için izin kontrolü yapar.
nesneleri koleksiyonlardan kaldırır.
va
dil
! Denetim ve Olay Günlükleri :
i.c o
! AfterMethodInvocation Kesiştiricisi : Kullanıcının okuma izni olmadığı
2.7. J2EE vs. Acegi Güvenlik Sistemi Artıları
ww w. ja
Güvenlik Çerçevesi (Security Framework) J2EE Güvenlik
Uygulama açısından kurulumu kolaydır. Kullanıcı Alanı konfigürasyonu kurgulayan kişinin elindedir. Standart olduğu için hakkında bir çok kaynak bulunabilir.
Eksileri Bir uygulama sunucusundan diğer uygulama sunucusuna bağlantı kurmak zordur. Uygulama geliştiricisi konfigürasyonu standartlaştırılmış olmasına rağmen, sunucu için alan konfigürasyonu standart değildir. Servis katmanı metotlarının güvenliği sadece EJB’ler kullanılarak yapılabilir. 28
Çok fazla XML konfigürasyonu gerektiriyor
m
Güvenlik konfigürasyonları uygulamadan tamamen bağımsızdır – uygulama sunucusunun taşınması durumunda kaygı duymanız gerekmez.
Öğrenme eğrisi çok diktir, ilk başlangıçta çok zor gelebilir.
i.c o
Acegi Güvenlik
Alan bilgisi uygulama ile birlikte paketlenir , yerini değiştirmek oldukça zordur.
dil
J2EE güvenliğin eksikliklerini kapatır ve uyarlama özelliği sayesinde aynı şeylere izin de verir. CAS ile tekil oturum açmaya izin verir.
Kaynaklar:
va
Hızla gelişiyor ve yenileniyor.
ww w. ja
AcegiSecurity / Matt Raible
Acegi Security System For Spring / Ben Alex Acegi Security Style / Matthew Porter
29