2009-12-17 3 views
6

스프링 보안을 사용하여 사용자, 그룹 및 권한을 관리하고 싶습니다.스프링 보안 그룹과 acl

도메인 개체를 보호하기 위해 ACL을 사용하고 싶지만 acl에 그룹을 할당하는 방법을 찾을 수 없습니다.

예 : 사용자 및 그룹이 있습니다. 각 그룹은 다음과 같은 증권을 보유 할 수 있습니다. - 포럼 관리 (ROLE_FORUM_MANAGER과 같은 역할) - 특정 포럼 (특정 포럼의 acl) 편집

또한 그룹은 역할이 ROLE_PERMISSION_MANAGER 인 사용자가 정의합니다. 하지만이 사용자가 정의한 모든 그룹은이 사용자 만 편집하고 관리 할 수 ​​있습니다. 따라서 그룹은 사용자에게 연결됩니다. 바로, 사용자가 Google 그룹을 생성한다고 상상하십시오.이 사용자는 자신이 만든 그룹에 대해서만 올바른 권한 그룹을 관리 할 수 ​​있습니다. 그래서 그는 자신의 Google 그룹의 특정 포럼을 관리 할 그룹을 만들 수 있습니다.

어떻게하면됩니까?

나는 봄 보안 문서 및 다음 자습서 (그래서이 링크에 저를 보내하지 마십시오)을 읽어 나는 '수동'비슷한 한 http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

답변

14

봄 보안 3.0을 확인하면 스프링 표현식 언어를 사용하여 ACL을 전혀 사용하지 않을 수 있습니다.

public class ForumPermissionEvaluator implements PermissionEvaluator { 

    public boolean hasPermission(Authentication authentication, 
      Object domainObject, Object permission) { 
     //implement 
    } 

    public boolean hasPermission(Authentication authentication, 
      Serializable targetId, String targetType, Object permission) { 
     //implement 
    } 
} 

:

@PreAuthorize("hasRole('ROLE_FORUM_MANAGER') and hasPermission(#forum,'update')) 
public void updateForum(Forum forum) { 
    //some implementation 
} 

당신은 다음과 같은 사용자 지정 권한 평가자의 hasPermission 방법을 구현하는 것이 :

는 예를 들어, 포럼을 편집, 당신은 다음과 같이 확보하는 방법을 것이다 마지막으로 애플리케이션 구성에서 함께 연결하십시오.

<beans:bean id="expressionHandler" 
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <beans:property name="permissionEvaluator" ref="permissionEvaluator"/> 
</beans:bean> 

<beans:bean id="permissionEvaluator" 
    class="com.centrix.core.security.GroupPermissionEvaluator" /> 
+0

예전에 보았지만 봄 보안 3은 공식 릴리스가 아니므로 사용하지는 않겠지 만 사용하기 위해 잠시 기다려야 할 것 같습니다. –

+0

"#forum"과 같은 메소드 인수를 사용하려면 프로덕션 JAR에 디버그 정보가 남아 있어야합니다. 아마도 좋은 생각이 아닙니다. – HDave

+0

빈 와이어 - 업에서 마지막 요소는'GroupPermissionEvaluator'보다는'ForumPermissionEvaluator'이어야합니까? 또 다른 질문 : 하나 이상의 PermissionEvaluator를 원한다면 expressionHandler가 하나뿐이므로 어떻게 유선이 될까요? –

1

: 즉, 나는 내 자신의 코드를했다가 특정 사용자가 편집/삭제할 수있는 인스턴스를 결정하고 Spring 보안에만 의존하여 기능에 액세스하고 현재 사용자에 대한 역할/인증 정보를 제공하는 데 올바른 역할을 수행했는지 확인합니다.

그래서 내 코드에서 나는 현재 사용자 (우리 자신의 User 클래스)를 결정했으며이 사용자에 따라이 사용자가 특정 인스턴스에 대해 어떤 권리가 있는지 결정했습니다.

public static User getCurrentUser() { 
    User user = null; 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null) { 
     Object principal = auth.getPrincipal(); 
     if (principal instanceof User) { 
      user = (User)principal; 
     } 
    } 
    return user; 
} 
+0

하지만 어떻게 적용하는지 이해할 수 없습니다. 당신 그룹의 한 그룹에? –

+0

나는 acl을 사용하지 않지만 group과 user는 둘 다 엔티티이고 (양방향) 관계 (최대 절전 모드로 관리)를 가지고있다. 사용자가 그룹에 대해 특수 작업을 수행 할 수 있는지 여부를 확인하기 위해 현재 사용자가 해당 그룹의 운영자인지 (즉 그룹이 사용자의 '보통 그룹'컬렉션에 포함되어 있는지) 확인합니다. 따라서 각 그룹의 중재자 목록은 기본적으로 해당 그룹의 'ACL'이며 스프링 보안 설정이 아닌 데이터베이스에서 관리됩니다. –

2

역할과 같은 그룹 만 사용합니다. Spring ACL 구현이 꽤 다루기 힘들고 대부분은 사용할 수 없다는 것을 알게되었습니다. 사용자를 "그룹"(모든 실제의 역할)에 할당하고 일반적인 역할 기반 권한 부여처럼이를 확인하십시오.

+0

그래서 나는 "GROUP_15"와 같은 권한을 동적으로 생성 할 수 있고, 그 후 GrantedAuthoritySid ("GROUP_15")가있는 acl을 포럼 75에 추가 할 수 있습니다. 내가 할 수 있다면, 나에게 좋다. 하지만 모든 역할과 권한을 동적으로 만들어야합니다. –

+0

적어도 그렇게 할 수는 있지만, 적어도 스프링 어노테이션을 사용하는 것은 아닙니다. 주석에서 사용하는 "ROLE"은 하드 코드되고 동적은 아닙니다. 나는 당신 자신의 MethodInterceptor를 작성하고 그들로부터 갈 것을 제안 할 것이다 - 그것은 간단한 인터페이스이고 많은 코드를 가지고 있지 않다. – Gandalf