내 응용 프로그램을 위해 Java에서 유연한 ACL 프레임 워크를 만들려고합니다.
많은 ACL 프레임 워크가 규칙의 허용 목록에 작성되며 규칙은 owner : action : resource 형식입니다 . 예를 들어
- "요한은 리소스 FOOBAR-1을 볼 수 있습니다"
- "메리가 리소스 FOOBAR-1을 볼 수 있음"
- "메리 리소스 FOOBAR-1을 편집 할 수 있습니다"
규칙은 데이터베이스에 쉽게 직렬화 / 지속될 수 있기 때문에 매력적입니다. 그러나 내 응용 프로그램에는 복잡한 비즈니스 논리가 있습니다. 예를 들어
- "5 년 이상 경력이있는 부서 1의 모든 사용자는 FOOBAR-1 자원을 볼 수 있으며 그렇지 않은 경우 권한이 없습니다."
- "날짜가 2016 년 3 월 15 일 이후 인 경우 부서 2의 모든 사용자는 FOOBAR-2 자원을 볼 수 있으며 그렇지 않은 경우 권한이 없습니다."
처음 생각했을 때, 이것과 같이 매우 복잡한 규칙을 처리 할 수있는 데이터베이스 스키마를 고안하는 것은 악몽 일 것입니다. 따라서 컴파일 된 응용 프로그램에 "굽기"하고 각 사용자에 대해 평가 한 다음 평가 결과로 owner : action : resource 규칙 을 생성해야하는 것처럼 보입니다 . 논리를 컴파일 된 응용 프로그램에 굽는 것을 피하고 싶습니다.
그래서 술어 : action : resource 형식으로 규칙을 표현하려고 생각했습니다 . 여기에서 술어는 사용자의 허용 여부를 결정하는 부울 식입니다. 이 술어는 Java의 Rhino 엔진에 의해 평가 될 수있는 JavaScript 표현식의 문자열입니다. 예를 들어
return user.getDept() == 1 && user.seniority > 5;
그렇게하면 술어를 데이터베이스에 쉽게 유지할 수 있습니다.
이 영리한 가요? 이 엉성한 가요? 이 특수 효과 입니까? 이다 과다 설계 ? 이것이 안전 합니까 (Java는 Rhino 엔진을 샌드 박스 할 수 있습니다).