2014-04-09 1 views
0

나는 스프링 보안 ACL 시스템을 갖추고 있으며, 제대로 작동하는 것처럼 보입니다. 단지 프로그램에서 권한 검사를 어떻게 수행해야하는지 잘 모르겠습니다.
내 앱이 뷰, 서비스 (비즈니스), DAO의 3 개의 레이어로 분할되어 있으며 서비스 레이어에서 인증을 수행하려고합니다. 따라서 도메인 객체를 인수로 취하는 메소드의 경우 :스프링 보안 권한 프로그램 검사

@PreAuthorize("hasPermission(#proj,'write'") 
public Project updateProject(Project proj) { 
............. 
} 

주석을 사용하면 문제가 해결됩니다.
하지만 acl이없는 객체를 인수로 취하는 메소드의 경우 사용자에게 권한이 있는지 프로그래밍 방식으로 확인해야합니다.

public Project updateProject(ProjectWapper projWrapp) { 

    Project p = projWrapp.getProject(); 
    // before performing any operation on project I need to know if current user has neccessary permissions on this object 
    // ??? how do i check that ? 

} 

내가 그것을 수행하는 AclService를 사용해야합니까 :

public class ProjectWrapper { 

    private Project project;  
    private Something something; 
    // setters and getters here 
} 

그래서 지금 내 서비스 방법은 인수의 유형을받은 :
Let`s 내가 객체 ProjectWrapper이 있다고? 권한을 만들거나 업데이트해야 할 때처럼 또는 클리너/더 좋은 가능성이 있습니까?
deleteProject (Long id) 메서드에 대해 동일한 질문을합니다. 먼저 현재 사용자에게 삭제 권한이 있는지 확인하기 위해 db에서 개체를 가져와야합니다.

답변

1

메소드 보안 주석은 Spring EL 표현식을 지원합니다. 래퍼 클래스의 경우 다음과 같이 사용할 수 있습니다.

@PreAuthorize("hasPermission(#projectWrapper.project, 'write'") 
public Project updateProject(ProjectWrapper projectWrapper) { 
    // body omitted 
} 

실제 개체 대신 개체 식별자가있는 경우 아래 패턴을 사용할 수 있습니다.

@PreAuthorize("hasPermission(#id, 'my.package.Project' 'delete'") 
public void deleteProject(Long id) { 
    // body omitted 
} 

요구 사항을 충족하기 위해 기본 구성 (예 : 개체 ID 검색과 같은 전략)을 조정해야 할 수 있습니다. 자세한 내용은 org.springframework.security.acls.AclPermissionEvaluator 클래스를 참조하십시오.