문제

ACEGI (SPRING) 보안을 사용하여 역할 기반 액세스 컨트롤을 사용하여 웹 앱을 구축하고 있습니다. 그래서 나는 역할을 가진 다른 사용자가 있습니다. ROLE_ADMIN, ROLE_USER 등 등
그러나 다양한 사용자 제약 조건을 구현해야합니다.

예를 들어 봅시다 :

사용자가 온라인으로 영화를 볼 수있는 사이트가 있다고 가정합니다. 역할이있는 사용자가 있습니다 ROLE_STANDARD_USER 그리고 ROLE_VIP_USER. 표준 사용자는 일주일에 3 편의 영화를 볼 수 있으며 VIP 사용자는 일주일에 10 편의 영화를 볼 수 있으며 다른 권한이 있습니다. 그리고 표준 사용자 그룹에는 일주일에 2 개의 영화를 추가로주고 싶은 한 명의 사용자가 있습니다. 허용 영화의 수는 때때로 변경 될 수 있습니다.
또한 판타지, 코미디, 클래식, 새로운 영화 등 다양한 범주의 영화가 있습니다. 일부 사용자는 자신의 역할에 관계없이 특정 범주에만 액세스 할 수 있기를 원합니다. 카테고리는 Dynamicaly를 작성하고 제거 할 수 있습니다.

이러한 유형의 사용자 제약 조건을 구현하기위한 표준 관행이 있습니까?
스프링 보안 역할과 권한을 사용하여 수행 할 수 있습니까?
아니면 앱에 규칙 기반 엔진을 추가하는 것을 고려해야합니까?

고맙습니다.

편집하다:
위의 예는 허구입니다. 저의 프로젝트는 학생들을위한 다양한 네트워킹 (및 기타) 장비에 대한 원격 액세스 권한을 부여하는 것과 관련이 있습니다. 그러나 사용자 제약 유형은 동일 할 수 있습니다.
불행히도, 사용자 액세스 및 제약 조건 모델은 완전하고 안정적이지 않습니다. 가까운 시일 내에 나는 현재 알려지지 않은 사용자를위한 다양한 추가 제약 조건을 구현하라는 지시를받을 수 있습니다.
따라서 앞으로 새로운 사용자 제약을 추가하거나 변경할 수있는 경로를 선택하고 싶습니다. 내부 모델 또는 데이터베이스 구조의 상당한 점검이 필요하지 않습니다. 가능하다면 가능하다면.

편집 2

현재 기본 사용자 제약 조건은 하드 코드 (프로토 타이핑 시스템에서 남은)입니다. 나는 그것을 먼저 어떤 종류의 매개 변수화 된 비즈니스 서비스 객체에 다시 시도한 다음 어디에서 갈 수 있는지 생각할 것입니다. 또한 Spring Security Authorization Decision Manager를 사용하는 것을 고려할 것입니다.

모든 제안에 감사드립니다!

도움이 되었습니까?

해결책

나는 선언적 역할 기반 보안 시스템이 당신이 찾고있는 세밀한 통제를 제공 할 것으로 기대하지 않을 것입니다. 당신은 이미 구현하려는 몇 가지 "비즈니스 규칙"기반 액세스 컨트롤을 설명했으며 시간이 지남에 따라 이러한 규칙이 더 복잡해 질 것으로 예상 할 수 있습니다. 따라서 보안 하위 시스템의 정보 조합이 필요하지만 (이 요청의 사용자는 누구입니까? 어떤 역할을 하는가?)는이를 비즈니스 데이터 및 규칙과 프로그래밍적으로 결합합니다 (이 사용자는 오늘 날짜가있는 경우 2 개의 무료 영화에 제출됩니다. 이 범위에 있습니다).

최소한 나는 그 비즈니스 논리를 캡슐화하는 서비스를 정의 할 것입니다. 완전 신부 규칙 엔진 사용 여부에 대한 결정은 추가 연구가 필요합니다.

다른 팁

스스로에게 묻기 전에 acegi (또는 규칙 엔진 등)가 그것을하기에 올바른 장소입니다.
귀하의 요구를 정확하고 완전히 분석하십시오.

각 주제를 고려합니다 (예를 들어 볼 수있는 영화 제한),이를 구현하는 방법에는 수많은 방법이 있으며 기능적 선택을해야합니다. 이미 세부 사항을 결정하지 않는 한 올바른 구현은 없을 수 있습니다!

a의 예 모델 당신의 필요를 위해 :

  • 에 따라 주당 일반 영화 수를 제한합니다. 의 합:
    • 역할 (3 또는 10)
    • 사용자 당 보너스 (언급되지 않은 경우 기본값 0)
  • 필요에 따라이 숫자를 업데이트하십시오
  • 영화를 카테고리 목록으로 제한합니다.
    • 사용자에게 목록이 지정된 경우 사용하십시오.
    • 그렇지 않으면 역할을 위해 제공되는 목록을 사용하십시오.

이 예제에는 많은 의미가 있으며, 귀하의 경우에 정확하거나 용납 할 수 없습니다.
시사점 :

  • 숫자를 업데이트 한 후 한도가 즉시 변경됩니다.
  • 주간 한도에 대한 기억은 없으며 과거에 대해서는 이것을 요구할 수 없습니다 (예 : 통계를 만들려면).
  • ...

이 모델이 귀하의 요구에 맞지 않는다고 가정하면 실제로 모델에 맞는 모델을 만드는 데 어려움을 겪고 있습니다. 일단 당신이 그것을 가지고 있다면, 구현에 대해 생각하십시오.

스프링 보안을 고려하면 솔루션을 구현할 수있는 한 가지 방법입니다. 구현 a AccessDecisionVoter 사용자의 액세스를 결정합니다. 참조 소스를 살펴보십시오 여기

또한 [Javadoc] [2]를보십시오. AccessDecisionVoter. 당신은 그것을 구현하여 규칙을 구현할 수 있습니다 vote 방법.

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)

Spring이 액세스를 처리하도록하십시오 (인증 및 승인). 의사 결정이 복잡해지면 규칙 엔진이 현명 할 수 있습니다. 투표 방법이 규칙 엔진으로 호출하도록하십시오. 이것은 명확한 의무 분리를 제공합니다. Spring Security가 액세스를 처리하고 규칙 엔진이 규칙을 계산하도록하십시오.

[2]: http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/accessdecisionvoter.html#vote(org.spramframework.security.authentication, java.lang.object, org.springframework.security.configattributedefinition)

인증 요구와 승인 요구가있는 것처럼 들립니다. 고맙게도 Spring Security는 두 가지를 잘 묘사합니다. 사용자는 보안 체인 (Form Logj, OpenID, SSL X509)을 통해 인증 한 다음, 한 번은 자신의 비즈니스 특정 유권자 (AccessDecisionManagers에서)가 이미 할당 된 번호를 보았을 때 귀하의 비즈니스 특정 유권자가 승인해야합니다. 영화의. 나중에 새로운 비즈니스 로직을 추가 해야하는 경우 단순히 신규/더 많은 유권자를 작성하여 관리자에게 주입하는 문제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top