봄 보안에서 예기치 않은 비트 단위 사용 권한 검사가 발생했습니다. 우리는 이것이 기대되는 행동인지 그리고 만약 그렇다면 역사가 무엇인지, 그리고/또는 이것에 대한 근거를 확인하고자합니다.봄 보안 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을 점검하지 않아야 할 부분은 무엇입니까?
- 비트 단위 사용 권한을 처리하는 기본 방법은 무엇입니까? 우리는 사용 권한을 잘못 구성하고 있습니까 아니면 비트 단위 사용 권한 검사를 구현해야합니까? (이 경우 기본 설정 방법은 무엇입니까?)
설명이나 안내에 감사드립니다.
https://jira.spring.io/browse/SEC-1166에 Spring Security가 채택 할 olifernas 솔루션을 제안한 코멘트를 추가했습니다. –