2011-09-20 30 views
11

Aktualnie integruję sprężyny bezpieczeństwa z naszym nowym stosem aplikacji internetowych. Będziemy musieli mieć możliwość udzielenia użytkownikom lub rolą uprawnień dostępu do określonego obiektu lub wszystkich obiektów określonego typu. Jednak to jedna rzecz, której tak naprawdę nie otrzymałem podczas pracy nad dokumentacją i przykładami:wiosna-bezpieczeństwo, w jaki sposób ACL przyznaje uprawnienia

Czy ACL przyznaje uprawnienia użytkownikowi/roli dla pojedynczego obiektu, czy robi to dla całego typu? Jak rozumiem, domain object oznacza typ, ale przykłady i samouczki wydają się przypisywać uprawnienia do konkretnych obiektów. Czy jestem po prostu zdezorientowany, czy mogę zrobić jedno i drugie? Jeśli nie, w jaki sposób mogę zrobić drugą?

Dzięki!

Odpowiedz

24

Dzięki sprężynowemu zabezpieczeniu można wykonać obie te funkcje. Jest to możliwe, ponieważ bezpieczeństwo wiosenne obsługuje tak zwane reguły uprawnień - w terminologii dotyczącej bezpieczeństwa wiosennego nazywają to osobami oceniającymi uprawnienia. Reguły uprawnień obejmują ACL, ale możesz także zabezpieczyć wystąpienia obiektów, gdy znajdują się w określonym stanie ... itd.

Jak to działa:

  1. Trzeba rozszerzyć PermissionEvaluator - pozwala mieć super niestandardową logikę do określania praw dostępu - można sprawdzić typ obiektu lub sprawdzić konkretny id, lub sprawdzić, czy użytkownik wywołanie metody jest użytkownik, który utworzył obiekt itd .:

    public class SomePermissionsEvaluator implements PermissionEvaluator { 
        @Override 
        public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { 
         if (permission.equals("do_something") && 
         /*authentication authorities has the role A*/) { 
          return true 
         } else if (permission.equals("do_something_else") && 
         /*authentication authorities has the role B*/) { 
          return /*true if targetDomainObject satisfies certain condition*/; 
         } 
    
         return false; 
        } 
    
        @Override 
        public boolean hasPermission(Authentication authentication, 
         Serializable targetId, String targetType, Object permission) { 
        throw new UnsupportedOperationException(); 
        } 
    } 
    
  2. teraz masz regułę zabezpieczeń, trzeba zastosować go poprzez adnotacje:

    @PreAuthorize("hasRole('SOME_ROLE_OR_RIGHT') and" + 
    " hasPermission(#someDomainObject, 'do_something')") 
    public void updateSomeDomainObject(SomeDomainObject someDomainObject) { 
        // before updating the object spring-security will check the security rules 
    } 
    
  3. Aby to zadziałało adnotacje zabezpieczeń powinny być włączone w applicationContext.xml:

    <global-method-security secured-annotations="enabled" pre-post-annotations="enabled"> 
        <expression-handler ref="expressionHandler"/> 
    </global-method-security> 
    
    <beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
        <beans:property name="permissionEvaluator"> 
         <beans:bean id="permissionEvaluator" class="com.npacemo.permissions.SomePermissionsEvaluator"/> 
        </beans:property> 
    </beans:bean> 
    
+0

Ach, dziękuję za szybką odpowiedź, nie sądzę, że byłoby tak łatwo zaimplementować PermissionEvaluator patrząc na implementację 'AclPermissionEvaluator', w której używają one pewnego rodzaju' ObjectIdentityRetrievalStrategy' ... – Pete

+0

Można wyróżnić zarówno listę, jak i kod, wystarczy dodać cztery dodatkowe spacje. Edytowałem ten post jako przykład, zobacz źródło. :) –

+0

Widzę teraz. Wielkie dzięki! –

Powiązane problemy