2013-07-01 3 views
10

웹 시큐리티를 위해 Apache Shiro 프레임 워크를 사용하려고합니다. (UI는 Vaadin 6을 기반으로합니다.) Shiro 사이트의 모든 예를 살펴보고 몇 시간 동안 봤지만 다음 요구 사항을 처리 할 수있는 확실한 방법을 찾을 수 없습니다.Apache Shiro를 사용하여 계층 적 역할/권한을 처리하는 방법은 무엇입니까?

응용 프로그램은 사용자가 회사 계층의 특정 부서에 속한 활동을 만드는 프로젝트 관리 도구의 일종이라고 가정합니다. 각 사용자는 여러 부서에서 근무할 수 있으며 각 부서마다 서로 다른 보안 역할을 수행합니다. 예 :

 
Department A  - User is 'Manager' here 
Department B 
    Department C  - User is 'Admin' here 
    Department D 

사용자가 부서 사용자의 '관리자'는도 (부 C의 조상이다) 부 D에 대한 '관리'역할을 상속한다 부서 C 사용자의 '관리자'입니다.

따라서, 기본 권한 검사 (I 일부 부서에 속하는 활동을 보려는 가정)을하는 것입니다 : 활동 사용자가보기를 시도하는

  1. 선택하면 부서 사용자에 속하는 역할이있다;
  2. 사용자가이 부서의 역할 을 기반으로 필요한 사용 권한을 가지고 있는지 확인하십시오..

"시스템 전체 역할"뿐만 아니라 "이 특정 부서의 역할"개념을 구현하는 방법에 대한 이해가 부족합니다.

위 예제를 "activity : view : 123"과 같은 권한 문자열로 변환하려면 어떻게해야합니까? 그리고 비즈니스 논리에서 어떻게 허가를 확인합니까?

Shiro의 구현에 대한 의문점이 더 많습니다. 바로 사용할 수있는 솔루션을 사용하고 싶습니다. 자체 구현을 제공하기위한 최소한의 노력이 필요합니다. 그러나 Shiro의 기본 제공 구현은 단순한 경우에만 설계된 것으로 보입니다. 복잡한 인증 구현의 예가 있습니까 (위의 경우를 다룰 수 있습니까)?

답변

3

누군가에게 유용 할 수있는이 문제에 대한 해결책을 설명하고 싶습니다. 나는 이것이 최적이 아니기 때문에 깨끗한 구현에 대한 어떤 제안에도 여전히 열려 있다고 생각한다.

  • 활동 : 편집
  • 활동보기

그리고 나는 또한 권한이 넓지 시스템에게 있는지 확인해야하지만이 달려

나는 다음과 같은 조치를 확보 할 필요가 가정 특정 부서에서 내 역할에. 내가 한 일은 내 영역에있는 사용자에 대해 '부서별'권한을 명시 적으로 추가 한 것입니다. 예 (게시물에 계층 구조를 참조)

  • DEP_A : 활동보기
  • DEP_C : 활동보기
  • DEP_C : 활동 : 나는 행동 여부를 확인 할 때마다

을 편집 일부 활동에 대한 허용 또는 거부, 나는 확인 권한 목록을 만들고있어.예 :

활동 A는 D 부서에 속하므로 '보고 싶습니다'. 확인하는 권한은 다음과 같습니다

  • DEP_D : 활동보기
  • DEP_C : 활동보기
  • DEP_B : 활동보기

내가 부서에서 C를 관리 해요 경우에, 나는 것 'DEP_C : activity : view'권한이 있으므로 수표가 전달됩니다. 그게 회사 구조 계층에서 권리 상속을 구현할 수 있습니다. 여기

권한 검사에 대한 책임을 내 서비스 클래스의 코드 snipplet입니다 :

@Override 
    public void checkIfOperationPermitted(SecurityOperation operation, 
     Object object) 
    { 
     final Subject currentUser = SecurityUtils.getSubject(); 

     if(currentUser.isPermitted(
     SecurityOperation.SYSTEM_ADMIN.getPermissionString()) || 
     currentUser.hasRole("admin")) 
     { 
     // no need to check anything else, 
     // admin is system wide role. 
     return; 
     } 

     if(object instanceof Activity) 
     { 
     // Activity permissions fully depends on organization and 
     // product hierarchies. PermissionResolver is just a class 
     // which generates list of permission strings based on 
     // department activity is belonging to. 
     Activity a = (Activity) object; 
     List<String> permissionsToCheck = 
      permissionResolver.resolveHierarchicalPermissions(operation, a); 
     boolean permitted = false; 
     for(String permission: permissionsToCheck) 
     { 
      if(currentUser.isPermitted(permission)) 
      { 
       permitted = true; 
       break; 
      } 
     } 
     if(!permitted) 
     { 
      throw new UnauthorizedException("Access denied"); 
     } 
     } 
     else 
     { 
     // Check for system wide permissions 
     currentUser.checkPermission(operation.getPermissionString()); 
     } 
    } 

나에 대해 생각했다 또 다른 방법으로 할 수 있습니다 내 영역에서 사용자에 대한 이러한 모든 권한을 추가 할 수 있지만이 회사 이후 계층을 거절하다 일반에는 N 계층이 포함되어있어 특정 사용자 (메모리 사용)의 사용 권한 목록에서 중복을 크게 증가시킵니다.

관련 문제