5

봄 보안에서 예기치 않은 비트 단위 사용 권한 검사가 발생했습니다. 우리는 이것이 기대되는 행동인지 그리고 만약 그렇다면 역사가 무엇인지, 그리고/또는 이것에 대한 근거를 확인하고자합니다.봄 보안 acl이 비트 단위 사용 권한을 비교하지 않음

우리는 spring-security-acl 3.0.7.RELEASE를 사용하는 grails plugin 인 spring-security-acl-1.1.1을 사용하고 있습니다.

ACL 등 aclUtilService.readAcl이 (OBJ) 반환 부여 역할과 대상 포함 우리가하려고하는 증류 시나리오 :

PrincipalSid[sampleuser]; permission: BasePermission[...........................A....=16] 
GrantedAuthoritySid[ROLE_RWD]; permission: CumulativePermission[............................D.WR=11] 
GrantedAuthoritySid[ROLE_RW]; permission: CumulativePermission[..............................WR=3] 
GrantedAuthoritySid[ROLE_R]; permission: BasePermission[...............................R=1] 

은 그 후 우리는 WRITE와 같은 하나의 권한을 확인하기 위해 기대하고있다을 true를 반환합니다. 그러나 이것은 지원되지 않는 것으로 보입니다. 예를 들어,의 실행을 위의 객체에 정의 된 모든 역할이있는 사용자를위한 :

READ?: ${aclUtilService.hasPermission(springSecurityService.authentication, obj, BasePermission.READ)} 
WRITE?: ${aclUtilService.hasPermission(springSecurityService.authentication, obj, BasePermission.WRITE)} 
DELETE?: ${aclUtilService.hasPermission(springSecurityService.authentication, obj, BasePermission.DELETE)} 
READ-WRITE?: ${aclUtilService.hasPermission(springSecurityService.authentication, obj, new BasePermission(BasePermission.READ.getMask() | BasePermission.WRITE.getMask()))} 

반환 출력 : 우리는 모든 이들의 기대 반면

READ?: true 
WRITE?: false 
DELETE?: false 
READ-WRITE?: true 

진정한 돌아왔다하기 . 우리가 권한이 궁극적으로 행 전용 정확한 마스크가 일치하는 이유를 설명

if ((ace.getPermission().getMask() == p.getMask()) && ace.getSid().equals(sid)) { 

을 포함 AclImpl에 체크 볼 수있는 소스에서 봤다면서. 단지이 줄을 변경

어느 정도 관여하고 우리는 봄 보안 ACL 3.1이 코드는 defined-로 전략을 부여하는 권한을 허용하도록 리팩토링 된 것으로 나타났습니다 https://jira.spring.io/browse/SEC-1166

그러나 기본 부여하는 전략이 여전히 정확한 마스크를 확인합니다. 따라서 :

  • 왜 비트 할당 마스크는 비트 마스크를 검사하지 않습니까? CumulativePermission을 점검하지 않아야 할 부분은 무엇입니까?
  • 비트 단위 사용 권한을 처리하는 기본 방법은 무엇입니까? 우리는 사용 권한을 잘못 구성하고 있습니까 아니면 비트 단위 사용 권한 검사를 구현해야합니까? (이 경우 기본 설정 방법은 무엇입니까?)

설명이나 안내에 감사드립니다.

+0

https://jira.spring.io/browse/SEC-1166에 Spring Security가 채택 할 olifernas 솔루션을 제안한 코멘트를 추가했습니다. –

답변

2

이것은 플러그인을 만들 때 많이 놀랐습니다. 비트 마스킹을 사용하는 척하는 것이 매우 이상한 것처럼 보였으며 결국에는 32 개의 사용 권한으로 제한되었습니다 (대부분의 응용 프로그램에 충분해야하지만). Ben Alex의 explantation을 위해 JIRA를보십시오 : https://jira.spring.io/browse/SEC-1140

+0

Burt에게 감사드립니다. SEC-1140은 그 배경과 그 배경을 완전히 설명합니다. 마스킹처럼 보이는 디자인을 지원하는 것이 일반적인 혼란으로 보입니다. 그러나 기본 동작은이를 활용하지 않습니다. 향후이 옵션을 읽는 사용자는 다음과 같이 표시됩니다. * CumulativePermission 대신 여러 개의 BasePermission 항목을 많이 사용하십시오. * 적어도 spring-security-acl을 사용하십시오. 3.1 및 사용자 지정 비교 전략을 제공합니다. –

+0

비트 마스크 비교를 수행하는 Spring의 DefaultPermissionGrantingStrategy의 작은 수정. https://gist.github.com/oliverfernandez/36846fcdc03696a7b829 어떻게 생각하십니까? – oliferna