2009-01-17 22 views
5

Web güvenliğini sağlamak için Spring Security kullanıyorum. URL'ler böyle sağlanmıştır:Spring Security ile bir URL'ye erişmek için hangi rollerin gerektiğini nasıl belirleyebilirim?

<security:http entry-point-ref="authenticationEntryPoint"> 
    <security:intercept-url pattern="/" access="ROLE_ANONYMOUS" /> 
    <security:intercept-url pattern="/assets/**/*" access="ROLE_ANONYMOUS" /> 
    ... 
    <security:intercept-url pattern="/**" access="ROLE_USER" /> 
    <security:anonymous granted-authority="ROLE_ANONYMOUS" /> 
</security:http> 

belirli durumlarda özel bir sayfaya yönlendirmek gerekiyor bir filtre var. Bununla birlikte, bu sayfa malesef dizininde maalesef bu özel sayfaya yönlendirilecek resim ve CSS dosyaları gerektirir. Filtrenin her URL kalıbını manuel olarak kontrol etmesini istemiyorum, çünkü gerçek URL yapılandırmam çok daha uzun ve diğer sayfalara da izin vermek istiyorum.

Belirli bir sayfanın filtresinden hangi rollerin gerektiğini belirlemek için bir yol var mı? ROLE_ANONYMOUS gerekmiyorsa yönlendirmemeyi seçebilirim.

cevap

2

Erişime izin verilip verilmeyeceğine karar verirken aslında gerçekleşen şeyin, URL'nin ve var olan kimlik doğrulamanın varsayılanı olan bir AccessDecisionVoter s dizisinden geçirilmesi olduğunu unutmayın. Bu seçmen, istenen kaynağın yapılandırmasını kontrol eder ve belirli bir rol gerekiyorsa, mevcut kimlik doğrulamanın bu role sahip olmaması durumunda isteği reddeder.

Çözüm için - seçmenlerden önce içeri giren diğer seçmenleri de ekleyebilirsiniz. Her bir seçmen, GRANT, DENY veya ABSTAIN'i iade etmeli ve işleme sadece ABSTAIN iade edilirse sonraki seçmenlere devam edecektir. Böylece kendi özel seçmeninizi yazabilir (ya da bu işe yarayacaksa mevcut olanı geri alabilir), rol seçmeninden önce ateş açabilir ve atıfta bulunduğunuz kaynaklara herhangi bir şekilde talepte bulunamazsınız.

Geçerli bir projede, geçici uygulamaya özel niteliklerin belirli bir kişinin normalde erişemeyecekleri kaynaklara erişmesine izin verebileceği bir şey yaptım ve bir yaklaşım olarak iyi çalışıyor.

+0

Bu iyi bir fikir, ama beni oraya getirmiyor. Sorun, kullanıcının erişime sahip olup olmadığına bakılmaksızın, filtrenin devreye girip özel sayfaya yönlendirilmesidir. Filtrenin, yönlendirilmemesi gerektiğinde bilmesi için bir yola ihtiyacım var ve bir URL için gerekli rollerin bilinmesi bunu yapacaktır. –

3

Spring Security 3'ü kullandığınızı varsayarsak, bu bilgilerin kaynağı (hangi öznitelikler/roller belirli bir yol için yapılandırılır) FilterSecurityInterceptor içine enjekte edilen FilterInvocationSecurityMetadataSource'dur. Dolayısıyla, belirli bir URL'niz varsa, FilterInvocationSecurityMetadataSource öğesinin getAttributes() yöntemine bir FilterInvocation (istek ve yanıttan oluşturulan) ileterek yapılandırılmış öznitelikleri sorgulayabilirsiniz.

Ad alanı tarafından oluşturulan iç çekirdeklere başvurmak biraz zor olabilir. Varsayarsak böyle bir şey uygulanmaktadır uygulamanız bağlamında, bir BeanPostProcessor ekleyerek onların içine enjekte edebilir, gelen çağrı yapmak istediğiniz kendi fasulye (veya fasulye) vardır:

public class FilterSecurityMDSExtractor implements BeanPostProcessor, BeanFactoryAware { 
    private ConfigurableListableBeanFactory bf; 

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     if (bean instanceof FilterInvocationSecurityMetadataSource) { 
      // Get your own bean from the BeanFactory here and inject the SecurityMetadataSource into it 
     } 
     return bean; 
    } 

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     return bean; 
    }  

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
     this.bf = (ConfigurableListableBeanFactory)beanFactory; 
    } 
} 

Not o Spring Security, bir kullanıcının bir WebInvocationPrivilegeEvaluator'unu otomatik olarak kaydeder; bu, bir kullanıcının gerçekten çağırmaksızın belirli bir URL'yi çağırıp açmadığını kontrol etmek için kullanılabilir. Bu, benzer şekilde, SecurityMetadataSource'u sorgular, ancak tam olarak burada olduğunuzdan değil.