Acegi Güvenlik Sistemi

ww w. ja

Hazırlayan : Akif Burak Tosun Hacettepe Universitesi - 20221925 İletişim: thunder_burak@hotmail.com

va
1

dil

Spring için

i.c o

m

İçindekiler:
Önsöz Bölüm 1: Güvenlik 1.1. 1.2. 1.3. Giriş Güncel Durum Üst Düzeyli Tasarım 1.3.1. 1.3.2. 1.3.3. Anahtar Bileşenler

Desteklenen Güvenli Nesneler Kurulum Nitelikleri

1.4. İstem Bağlamları 1.4.1. Tarihsel Gelişim 1.4.2. SecurityContext

1.5. Kimlik Denetimi (Authentication) 1.5.1. Kimlik Denetim İstemleri 1.6. Yetki Protokolü (Authorization) 1.6.1. Verilen Yetkiler

ww w. ja
Bölüm 2 : Neden ve Nasıl Acegi? 2.1. J2EE’de CMA 2.1.1. Temel 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ı

1.6.2. Erişim Kararları Yönetimi

2.1.2. Form Tabanlı Kimlik Denetimi

2.5.2. “appContext~security.xml” ayarları
2

va

dil

i.c o

m

2.5.3. Temel Kimlik Denetimi 2.5.4. Güvenli HTTP İstemi 2.5.5. Form Tabanlı Kimlik Denetimi 2.5.7. Parola Şifreleme 2.5.8. JDBC Sağlayıcısı 2.5.9. SQL Uyarlama

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 2.7. J2EE vs. Acegi Güvenlik Sistemi

ww w. ja
3

va

dil

i.c o

m

Spring için Acegi Güvenlik Sistemi (AGS)

Ö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 veren rehberlik sağlamaktadır.

Bölüm 1 : Güvenlik
1.1.Giriş

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 sistemdir. Bu güvenlik mimarisi “The Spring Way” gelişiminin üstüne kurulmuş

ww w. ja
sağlayabilen bir sistemdir. olduğu işlemi yapıp yapamayacağının

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

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

va

dil
4

i.c o

m

Spring için AGS’de başından sonuna kadar kimlik denetimi yapılacak 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 olduğunuz- bir kavram bulunmamasına karşın eşdeğer işlevsellik Acegi Güvenlik tarafından sağlanmıştır.

1.2.Güncel Durum

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

ww w. ja
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

va

dil

i.c o

m
5

uygulamaları etki alanındaki örnek nesnelerin de güvenliğini sağlamalıdır. Acegi Güvenlik , bu dört temel şirket uygulaması gereksinimlerini ortak olarak içine alan geniş bir çatıda sağlayabilmektedir.

-

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

ww w. ja
Collection’larını silerek yapar.

- “AfterInvocationManager” : “Güvenli Nesne” kesiştirici’den dönen bir nesneyi düzenleyebilir; bu işlemi, tekil şahısın erişim yetkisi olmayan

- Erişim Denetim Listesi yönetim paketi : Erişim denetim listelerinin etki alanındaki örnek nesnelere uygun olup olmadığını denetler.

va

dil

i.c o

Spring için AGS esasen 8 temel işlevsel kısımdan oluşmaktadır:

m
6

“Güvenli Nesne” kesiştirici, Acegi Güvenlik’in çoğu anahtar sınıfını 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

AbstractSecurityInterceptor ’ın somut uygulamaları belirtilmiştir.

ww w. ja

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.

va

Şekil 1: “Güvenli Nesne” Modeli

dil
7

i.c o

m

Her güvenli nesne net.sf.acegisecurity.intercept altında

Böylece sunulan her tür güvenli nesneyi destekler.

Sadece durdurma ve yetkilendirme istemleri için tamamen yeni bir yol

Ö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 JoinPoint ve web istemi FilterInterceptor) şeffaflıkla kullanmaktadır.

Yukarıda belirtilen Acegi Güvenlik için gerekli olan sekiz anahtar 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. İlki AOP Alliance MethodInvocation’ı içermektedir. Bu Spring

ww w. ja
duruma alışkın hale gelmiştir.

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 İkinci tür AspectJ JoinPoint’ı içerir. AspectJ; genellikle Spring bean

kabının dışında yönetilmesiyle birlikte , etki alanındaki örnek nesnelerin

va

dil

i.c o

tasarlamak isteyen yazılımcılar güvenli nesneleri direkt olarak kullanmalıdır.

m
8

kendi paketine sahiptir. Diğer bütün paketler güvenli nesneden bağımsızdır.

güvenliğini sağlamada tek yol olarak kullanılır. AspectJ kullanarak “new

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 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. 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 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 , bir MethodInvocation herhangi bir metodu herhangi argümanlarla

ww w. ja
gerekli güvenlik kurulumuyla ,

ç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

http://some.bank.com/manage/timesheet.jsp sayfasına yapılan

bir istem için gerekli güvenlik kurulumu birbirinden farklı olmalıdır.

va

dil

i.c o

m

Person();” gibi standart mimariler kullanılabilir ve tüm güvenlik Acegi

9

Farklı istemlerle alakalı çeşitli güvenlik kurulumlarını saklamak için kurulum niteliği kullanılır. Gerçekleştirim katmanında bir kurulum niteliği ConfigAttribute arayüzü tarafından simgelenir.

Alakalı istem ile ilişkilendirilmiş ConfigAttribute’lar yığını bir

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

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

olan detayları ConfigAttributeDefinition içeriğine bakarak bulabilir.

1.4. İstem Bağlamları
1.4.1. Tarihsel Gelişim

ww w. ja
bağlantıyı izlemeniz yeterlidir: ork.devel/8290

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

http://article.gmane.org/gmane.comp.java.springframew

va

böylece “ObjectDefinitionSource gerçekleştirimi” kendisi için gerekli

dil

i.c o

ConfigAttributeDefinition içerisinde tutulur. Bu somut sınıf sadece

m

10

1.4.2. SecurityContext (SecureContext) SecurityContext’leri saklamak için Acegi Güvenlik Sistemi SecurityContextHolder kullanır. SecurityContext nesnesi bir tek 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 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

kişiye ait kimlik belgesi istemci kodu tarafından yerleştirilir.

ww w. ja
11

va

AuthenticationManager tarafından yerleştirilirken , Tekil kişi ve bu

dil

i.c o

m

Ş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
yaratılır. alınır.

! 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

! 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

va

Şekil 2: Anahtar Kimlik Denetim Mimarisi

dil

i.c o
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

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. GrantedAuthority tek bir metodu olan bir arayüzdür:

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
getAuthority() null döndürür.

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

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.

va

dil
13

i.c o

gerçekleştirimlerinde GrantedAuthority nesnelerini saklayacak bir diziye

m

1.6.2. Erişim Kararları Yönetimi AccessDecisionManager son erişim kontrol kararlarını almadan sorumludur. Bu arayüz üç metot içerir:

Object object, ConfigAttributeDefinition config) throws AccessDeniedException;

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

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 Customer argümanı için MethodInvocation’ı sorgulamak daha kolay

ww w. ja
fırlatılır.

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

va

ilgili veriler AccessDecisionManager ‘ın elinden geçer. Buradaki güvenli

dil

i.c o

public void decide(Authentication authentication,

m
14

Bölüm 2 : Neden ve Nasıl Acegi?

2.1. J2EE’de CMA

! CMA (Container Managed Authentication), Servlet API üzerine kurulmuştur.
!

security-constraints (güvenlik kısıtlamaları) , web.xml içerisinde yapılandırılır.

!

Kimlik denetim alanı yapılandırması , uygulama sunucusu

2.1.1. Temel Kimlik Denetimi
<security-constraint>

ww w. ja
<web-resource-collection> </web-resource-collection> <auth-constraint> </auth-constraint> </security-constraint> <login-config> </login-config>

<web-resource-name>Güvenli Alan</web-resource-name> <url-pattern>/*</url-pattern>

<role-name>*</role-name>

<auth-method>TEMEL</auth-method> <realm-name>Güvenli Bölge</realm-name>

va
15

içerisinde yapılır.

dil

i.c o

m

2.1.2. Form Tabanlı Kimlik Denetimi ! /WEB-INF/web.xml:
<security-constraint> <web-resource-collection>

<web-resource-name>Güvenli Alan</web-resource-name> <url-pattern>*.html</url-pattern> </web-resource-collection> <auth-constraint>

<role-name>*</role-name> </auth-constraint> </security-constraint> <login-config>

<auth-method>FORM</auth-method> <form-login-config>

<form-login-page>/login.jsp</form-login-page> <form-error-page>/loginError.jsp</form-error-page> </form-login-config> </login-config>

ww w. ja
<p> id="j_password"/> </p> </form>

! /login.jsp

<form id="loginForm" method="post" action="j_security_check">

<label for="j_username">Kullanıcı Adı:</label> <input type="text" name="j_username" id="j_username"/><br/>

<label for="j_password">Parola:</label> <input type="password" name="j_password"

<button type="submit">Giriş</button>

va

dil

i.c o

m
16

! /loginError.jsp
<p> Giriş Hatalı - lütfen <a href="index.jsp">yeniden deneyin</a>. </p>

2.2. Tomcat Alanları (Tomcat Realms)

! MemoryRealm , JDBCRealm , DataSourceRealm , JAASRealm,

! JDBCRealm Örneği:

debug="99" reloadable="true" antiJARLocking="true" antiResourceLocking="true">

ww w. ja
userCredCol="password" </Context>

<Realm className="org.apache.catalina.realm.JDBCRealm"

debug="99" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/ equinox?autoReconnect=true"

connectionName="root" connectionPassword="" userTable="users" userNameCol="username"

userRoleTable="user_roles" roleNameCol="rolename"/>

va

<Context path="/equinox-security" docBase="equinox-security"

dil

JNDIRealm

i.c o
17

m

2.3. CMA’daki problemler
! Düşünüldüğü gibi portatif değildir

! 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 filtreleyerek yakalama imkanımız yok

3. Gerçekleştirimi farklı sunucularda değişir.

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
(örneğin : /**/admin*.html) LDAP , CAS

sağlayabiliriz.

! URL örüntüleri her zamanki ifadelerle veya Ant-türü örüntülerle olabilir

! Desteklediği kimlik denetim yöntemleri : Basic, Digest, Form, Yale Central Authentication System(CAS)

! Kimlik denetim sağlayıcıları (Authentication providers) : JDBC , XML,

va

dil
18

i.c o

! Bütün servlet kapları(container) JDBCRealm’le taşınamaz

m

2.5. Acegi Güvenlik Ayarlamaları

2.5.1. “web.xml” ayarları
<filter>

<filter-name>securityFilter</filter-name> <filter-class>

net.sf.acegisecurity.util.FilterToBeanProxy </filter-class> <init-param>

<param-name>targetClass</param-name> <param-value>

net.sf.acegisecurity.util.FilterChainProxy </param-value> </init-param> </filter> <filter-mapping>

<filter-name>securityFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

ww w. ja
gerçekleştirir :

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

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.

va

dil

i.c o
19

m

o basicProcessingFilter: Bu süzgeç bir HTTP isteminin temel kimlik denetimi başlıklarını işleme koyar ContextHolder’ın içine yerleştirir.

o securityEnforcementFilter: Bu süzgeç istemleri, kullanıcıların hangi URL’lere gitme izni olduğunu belirleyen FilterSecurityInterceptor’a iletir

<bean id="filterChainProxy"

class="net.sf.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value>

CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT

/j_security_check*=

httpSessionContextIntegrationFilter,

ww w. ja
remoteUserFilter </value> </property> </bean>

authenticationProcessingFilter

/*.html*=httpSessionContextIntegrationFilter, remoteUserFilter,anonymousProcessingFilter, securityEnforcementFilter

/*.jsp=httpSessionContextIntegrationFilter,

va

dil

<!-- ======================= FILTER CHAIN ====================== -->

i.c o

m
ve sonuçlarını
20

2.5.3. Temel Kimlik Denetimi
<!-- ================== AUTHENTICATION ================== -->

<bean id="authenticationManager"

<property name="providers"> <list>

<ref local="daoAuthenticationProvider"/> </list> </property> </bean>

<bean id="inMemoryDaoImpl"

class="net.sf.acegisecurity.providers.dao.memory. InMemoryDaoImpl">

</bean>

<bean id="daoAuthenticationProvider"

ww w. ja
</bean> BasicProcessingFilter"> </bean>

class="net.sf.acegisecurity.providers.dao. DaoAuthenticationProvider"> <property name="authenticationDao" ref="inMemoryDaoImpl"/>

<bean id="basicProcessingFilter" class="net.sf.acegisecurity.ui.basicauth.

<property name="authenticationManager" ref="authenticationManager"/>

<property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint"/>

va

<property name="userMap" value="tomcat=tomcat,ROLE_USER"/>

dil

i.c o

class="net.sf.acegisecurity.providers.ProviderManager">

m

21

<bean id="basicProcessingFilterEntryPoint"

class="net.sf.acegisecurity.ui.basicauth. BasicProcessingFilterEntryPoint">

<property name="realmName" value="ProtectedArea"/> </bean>

2.5.4. Güvenli HTTP İstemi

<!-- =============== HTTP REQUEST SECURITY ============== --> <bean id="httpSessionContextIntegrationFilter" class="net.sf.acegisecurity.context.

HttpSessionContextIntegrationFilter"> <property name="context"

value="net.sf.acegisecurity.context.security. SecureContextImpl"/> </bean>

<bean id="securityEnforcementFilter"

class="net.sf.acegisecurity.intercept.web. SecurityEnforcementFilter">

ww w. ja
</bean> value="false"/> </property> </bean>

<property name="filterSecurityInterceptor" ref="filterInvocationInterceptor"/>

<property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint"/>

<bean id="httpRequestAccessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased"> <property name="allowIfAllAbstainDecisions"

<property name="decisionVoters"> <list><ref bean="roleVoter"/></list>

va

dil

i.c o

m
22

<bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/> <bean id="filterInvocationInterceptor"

class="net.sf.acegisecurity.intercept.web. FilterSecurityInterceptor">

<property name="authenticationManager" ref="authenticationManager"/>

<property name="accessDecisionManager"

ref="httpRequestAccessDecisionManager"/> <property name="objectDefinitionSource"> <value>

CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /*.html*=ROLE_USER /*.jsp=ROLE_USER </value> </property> </bean>

ww w. ja
2.5.5. Form Tabanlı Kimlik Denetimi sadece xml.

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

va
23

dil

i.c o

m

2.5.6. Kimlik Denetimi Sağlayıcıları (Authentication Providers)
<bean id="daoAuthenticationProvider" class="net.sf.acegisecurity.providers.dao. DaoAuthenticationProvider">

<property name="authenticationDao" ref="inMemoryDaoImpl"/>

<bean id="inMemoryDaoImpl"

class="net.sf.acegisecurity.providers.dao.memory. InMemoryDaoImpl"> <property name="userMap"> <value>

tomcat=tomcat,ROLE_USER

springlive=springlive,ROLE_USER </value> </property> </bean>

2.5.7. Parola Şifreleme

<bean id="inMemoryDaoImpl"

class="net.sf.acegisecurity.providers.dao.memory.

ww w. ja
InMemoryDaoImpl"> <property name="userMap"> <value> ROLE_USER ROLE_USER </value> </property> </bean>

tomcat=536c0b339345616c1b33caf454454d8b8a190d6c,

springlive=2a9152cff1d25b5bbaa3e5fbc7acdc6905c9f251,

va

dil
24

i.c o

</bean>

m

<bean id="daoAuthenticationProvider" class="net.sf.acegisecurity.providers.dao. DaoAuthenticationProvider">

<property name="authenticationDao" ref="inMemoryDaoImpl"/> <property name="passwordEncoder" ref="passwordEncoder"/>

<bean id="passwordEncoder"

class="net.sf.acegisecurity.providers.encoding. ShaPasswordEncoder"/> </bean>

2.5.8. JDBC Sağlayıcısı

! JDBC kullanabilmek için dataSource’a bağımlı bir bean tanımlamamız yeterlidir:

<bean id="jdbcDaoImpl"

class="net.sf.acegisecurity.providers.dao.jdbc. JdbcDaoImpl">

ww w. ja
</bean>

<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 = ?";

va

dil

i.c o
25

</bean>

m

2.5.9. SQL Uyarlama ! SQL’i yeniden yazmak için usersByUsernameQuery ve

authoritiesByUsernameQuery özelliklerini belirlememiz gerekir:

<bean id="jdbcDaoImpl"

class="net.sf.acegisecurity.providers.dao.jdbc. JdbcDaoImpl">

<property name="dataSource" ref="dataSource"/> <property name="usersByUsernameQuery">

<value>SELECT username,password,enabled as 'true' FROM users WHERE username = ?</value> </property>

<property name="authoritiesByUsernameQuery"> <value>SELECT username,rolename FROM user_roles

</property>

<property name="passwordEncoder" ref="passwordEncoder"/> </bean>

ww w. ja
26

va

WHERE username = ?</value>

dil

i.c o

m

2.5.10. Metotları Rollerle Güvelik Altına Alma

<bean id="securityInterceptor"

class="net.sf.acegisecurity.intercept.method.aopalliance. MethodSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager"/>

<property name="accessDecisionManager" ref="accessDecisionManager"/>

<property name="objectDefinitionSource"> <value>

org.appfuse.service.UserManager.getUser=ROLE_ADMIN org.appfuse.service.UserManager.getUsers=ROLE_USER org.appfuse.service.UserManager.removeUser=ROLE_ADMIN org.appfuse.service.UserManager.saveUser=ROLE_ADMIN </value> </property> </bean> ...

<bean id="userManager" parent="txProxyTemplate">

ww w. ja
</property> </property> </bean>

<property name="target">

<bean class="org.appfuse.service.impl. UserManagerImpl" autowire="byName"/>

<property name="preInterceptors"> <list><ref bean="securityInterceptor"/></list>

va

dil

i.c o

m

27

2.6. Diğer Özellikler
! Access Control Lists (ACLs) : Her nesne için izin kontrolü yapar.

nesneleri koleksiyonlardan kaldırır. ! Denetim ve Olay Günlükleri :

2.7. J2EE vs. Acegi Güvenlik Sistemi
Güvenlik Çerçevesi (Security Framework) J2EE Güvenlik

va
Artıları
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.

dil
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

ww w. ja

i.c o

! AfterMethodInvocation Kesiştiricisi : Kullanıcının okuma izni olmadığı

m

Acegi Güvenlik

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. Hızla gelişiyor ve yenileniyor.

Kaynaklar:

ww w. ja

AcegiSecurity / Matt Raible

Acegi Security System For Spring / Ben Alex Acegi Security Style / Matthew Porter

va
29

dil

i.c o

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.

Alan bilgisi uygulama ile birlikte paketlenir , yerini değiştirmek oldukça zordur.

m

Çok fazla XML konfigürasyonu gerektiriyor

Sign up to vote on this title
UsefulNot useful