2010-02-26 6 views
2

내 논리 계층 내에서 다양한 작업에 대한 사용 권한을 확인해야합니다. 일부 행동은 일반적이지만 일부는 고도로 전문화되어 있습니다. 각 동작에는 해당 동작을 수행하기 전에 평가되는 해당 권한 계층 구조가 있습니다. 나는 내 머리 속에서 건축 아이디어를 던져 왔지만, 확장 성 있고 단순하며 우아하다고 생각되는 단단한 것에 도달하지 못했습니다.동작, 권한 및 아키텍처

현재의 코드는 다음과 같은 :

public class LogicObject 
{ 
     public void Add() 
     { 
      Check Add Permission 
      Perform 
     } 
     public void Update() 
     { 
      Check Update Permission 
      Perform 
     } 
} 

이 아키텍처의 문제점은 첫째 정말 모두 확장하지 않고, 두 번째는 나없이 권한을 확인하는 것을 허용하지 않는 것입니다 행동을 수행합니다.

public class AddAction : IAction 
{ 
    public bool IsPermitted; 
    public void Perform(); 
} 

public class LogicObject 
{ 
    public IAction AddAction {get { return new AddAction(); } } 
} 

나는이 아키텍처에 대해서 더 좋아하지만 난 꽤 그것을 설정하고 있지 않다 :

는 내가 가진 또 다른 아이디어는 이런 일을하는 것이 었습니다. 조금 호사스러운 것 같습니다. 나는이 유형의 건축이 독특하다는 것을 상상할 수 없다. 이 일을하는 더 좋은 방법의 예가 무엇입니까?

답변

4

또 다른 옵션은 Aspect Oriented Programming을 사용하여 메서드 액세스 권한을 제어하는 ​​서비스 외부의 구성 요소를 사용하는 것입니다. 기본적으로 의미하는 것은 메소드가 권한 부여를 수행 할 코드에 의해 런타임에 랩핑된다는 것입니다.

java 용으로 구현하는 예제 솔루션은 Spring Security이며 인증 체계를 사용자 정의하고 정의하는 다양한 방법을 제공합니다. 오프 물론 당신이 당신의 승인 자체를 정의와 함께 보안 컨텍스트를 정의하고 그 문맥과 logicObject 클래스에 대한 프록시를 생성하는 추가 코드가 필요합니다

public class logicObject { 
    @PreAuthorize("hasRole('ROLE_USER')") 
      public void update() { 
       //Perform 
      } 

    //... 
    } 

: 목적은 다음과 같을 것이다.

코드 예제 에서처럼 C#에서는 역할 기반 보안과 [System.Security.Permissions] [2] 네임 스페이스의 모든 항목을 살펴볼 수 있습니다. 이 속성을 사용하면 속성을 사용하여 런타임에 메서드 액세스를 제어 할 수 있습니다. 사용자 정의 속성 W 권한 부여 제공자를 정의 할 수 있습니다. 이를 사용하면 다음과 같이 보일 수 있습니다.

public class LogicObject 
{ 
    [PrincipalPermissionAttribute(SecurityAction.Demand, Role="ROLE_USER")] 
     public void Add() 
     { 
      //Perform 
     } 

} 
0

첫 번째 예가 그다지 멀지 않았다고 생각합니다. 논리를 반으로 나누었습니다. 외관상으로 보이는 클래스 멤버를 외면으로 만들었습니다. 실제로 작업을 수행하는 내부 멤버 (개별 멤버)와는 별도로 만듭니다. 따라서 외부 facades 작업은 함수 호출을 수용하고 보안 검사를 수행하며 적절하게 응답해야합니다. 이는 또한 보안 점검이 수행 된 위치에 대해 일관된 접근 방식을 가짐을 의미합니다.

다른 옵션으로는 Microsoft Enterprise Libraries가 있습니다. 이러한 종류의 것을 다루는 보안 블록이 있기 때문입니다. 무료 (당신은 MS 캠프에있는 경우 좋은 적합성을 나타낼 가능성이 높습니다)에 대한 보안 프레임 워크를 얻을, 그리고 몇 가지 세부 사항에 귀하의 질문을 커버 예제 코드가 될 것입니다.

Tom Hollanders 블로그가 보일 장소가 될 수 있습니다. 그렇지 않으면 CodePlex에서 EntLibs를 얻을 수 있습니다.

1

여기 C 스타일링을 사용하고있는 것처럼 보입니다.사용자가 권한을 가지고 있는지 확인하기 위해

public class LogicObject 
{ 
     [PrincipalPermission(Security.Demand, Role="AddItem")] 
     public void Add() 
     { 
      Perform 
     } 
     [PrincipalPermission(Security.Demand, Role="AddItem")] 
     public void Update() 
     { 
      Perform 
     } 
} 

PrincipalPermission은 Thread.CurrentPrincipal 사용자를 확인 : 문제에 대한 인터넷 접근 방식은 예를 사용하여 정의하는 방법에 방법을 실행하는 데 필요한 권한 속성을 연결하는 것입니다 문제의 행동. 비슷한 기능을 가진 사용자 지정 특성을 작성했지만 일반 권한이나 사용 권한 대신 행 수준 보안을 더 많이 처리합니다.

속성을 사용하는 이점은 논리를 반복 작성하는 것과 달리 속성을 한 번 코딩 할 수 있고 코드가 속성의 모든 소비자에게 적용된다는 것입니다.

+0

나는 게시하기 전에 Amitay Dobo를 완전히 읽었어야했다. 첫 번째 예제에서 Java 코드를 봤고 나머지 코드는 건너 뜁니다. 내 잘못이야. – thaBadDawg