2012-03-21 3 views
0

저는 스프링 시큐리티를 처음 접했습니다. 나는 개체의 속성 값에 따라 권한을 부여할지 여부를 결정하는 사용자 정의 유권자를 만드는 작업을 수행하고 있습니다. 즉, 객체 인스턴스 A의 값이 X 인 속성 X가있는 경우 ROLE_MGR을 가진 사용자가 액세스 할 수 있습니다. 오브젝트 인스턴스 B가 X 속성에서 값 j를 갖는 경우 ROLE_MGR은 액세스 할 수 없습니다. 그렇게 할 수 있습니까? 그렇다면 무엇을해야합니까? 이것이 가능하지 않으면 Spring Security를 ​​사용하지 않기로 결정할 수 있습니다.개체의 속성 값을 사용하여 액세스를 결정할 수 있습니까?

+0

,하지만 문제를 정확하게 당신이 그것을 구현 예 그것이가 있습니까? 이것은 꽤 똑바로 보인다. – Simeon

+0

커스텀 유권자 (AccessDecisionVoter 구현)를 사용하고 있었지만 도메인 객체를 획득 할 방법이 없습니다. 맞춤 유권자의 도메인 개체 속성 값을 확인하려면 어떻게해야합니까? 또는 맞춤 설정을 위해 다른 인터페이스/클래스를 조사해야합니까? – chanakya2

+0

"개체"에 대해 좀 더 설명해야한다고 생각합니다. 그것은 어디에 있고 어떻게 액세스 할 인스턴스를 만들었습니까? 그것은 본질적으로 해답이있는 곳인 것처럼 보입니다. 유권자가 DAO를 주입하여 액세스 할 수 없다면 그 이유를 설명해야합니다. –

답변

0

알아 냈습니다. 사용자 지정 권한 평가기를 사용해야합니다. 내 코드에서 조각이 비슷한 일을하려고 할 수있는 사람은 아래 제공됩니다

security.xml

<security:global-method-security 
    pre-post-annotations="enabled"> 
    <security:expression-handler ref="expressionHandler" /> 
</security:global-method-security> 

<bean id="expressionHandler" 
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <property name="permissionEvaluator"> 
     <bean id="permissionEvaluator" 
      class="org.krams.tutorial.infrastructure.SomePermissionsEvaluator" /> 
    </property> 
</bean> 

서비스 인터페이스를 @PostFilter ("hasPermission (filterObject, '읽기')") 공개 목록 getAll();

사용자 권한 평가자

@Override 
public boolean hasPermission(Authentication authorities, 
     Object targetDomainObject, Object permission) { 

    boolean Decision = false; 
    System.out.println("Initial Decision: " + Decision); 

    Date cutoffDate = null; 
    try { 
     cutoffDate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH) 
       .parse("January 1, 2012"); 
     System.out.println("Cutoff Date: " + cutoffDate.toString()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("Domain Object Date: " 
      + Post.class.cast(targetDomainObject).getDate()); 

    if (Post.class.cast(targetDomainObject).getDate().before(cutoffDate)) { 
     Decision = false; 
     System.out.println("In before"); 
    } else { 
     Decision = true; 
     System.out.println("In after"); 
    } 
    System.out.println("Final Decision: " + Decision); 
    System.out.println("--------"); 
    return Decision; 
} 
0

그럴 수도 있지만 우선 Spring Securitys 도메인 객체 보안을 살펴보십시오. 이것은 객체에 세분화 된 액세스 권한을 부여하는 데 사용됩니다. 여기를 참조하십시오. http://static.springsource.org/spring-security/site/docs/3.0.x/reference/domain-acls.html

+1

나는 acl에 대한 문서를 이미 읽었으며 도메인 객체의 속성 값을 기반으로 결정을 내리는 방법을 명시하지 않았다. – chanakya2

+0

나는 동의한다, OP는 도메인 객체 자체가 아닌 도메인 객체 속성의 값을 기반으로 보안을 유지하려고한다. –

관련 문제