인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

twosom님의 프로필 이미지
twosom

작성한 질문수

스프링 시큐리티

8) 계층 권한 적용하기- RoleHierarchy

RoleHierarchy 엔티티를 따로 만들지 않아도 되나요?

해결된 질문

작성

·

362

2

RolehierarchyImpl 에 String 타입 프로퍼티에 A > B\n 

이런 타입으로 지정만 해주면 될 것 같아서 Role 엔티티 자체에 RoleGrade 라는 ENUM 타입을 지정해줘서 알파벳 순으로 가져와서 그걸 for-loop 돌리면서 문자열만 만들면 될거 같아서 해봤는데 실시간으로 적용이 되더라구요.

@Override
public void reloadRoleHierarchy() {
StringBuilder sb = new StringBuilder();

List<Role> allRoles = roleRepository.findAllWithRoleGrade();

for (int i = 0; i < allRoles.size(); i++) {
try {
allRoles.get(i + 1); /* 검증 코드 */
sb.append(allRoles.get(i).getRoleName());
sb.append(" > ");
sb.append(allRoles.get(i + 1).getRoleName());
sb.append("\n");
} catch (Exception e) {
break;
}
}

this.roleHierarchy.setHierarchy(sb.toString());

}

ResourcesController 에서 자원 등록, 삭제 하고나서 reload 메소드를 호출했듯이 이 메소드를 Role 등록, 삭제 뒤에 등록해주니 잘 되네요.

혹시 실무에서는 이런식으로 쓰는것보다 엔티티를 따로 만들어서 관리하는것을 선호하나요?

RoleHierarchy 엔티티 안에 자기 자신을 ManyToOne 으로 조인하니 너무 어려워서 이렇게 해보긴 했는데, 실무에서는 엔티티 방식으로 관리하는걸 선호하는지 궁금해서 질문드립니다.

혹시 몰라 git 링크 첨부해봅니다. 한번 봐주시면 감사하겠습니다. review4 브랜치입니다.

https://github.com/twosom/SpringSecurity-ProjectReview.git

*추가적으로 이제 계층 구조 Role을 구성했으면 

Resources 랑 Role 은 굳이 N : N 관계로 구성하지 않아도(테이블 상에서는 1 : N , N : 1)

되는건가요? 기존에는 하나의 Reosurces 에 여러개의 Role 이 있을 수 있고 Role 하나가 여러 Resources 에 포함될 수 있기에 N : N 관계로 만들었지만, 계층 구조가 적용되면 외래키가 Resources 테이블에만 존재해도 (N : 1)  될 것 같아서요.

항상 좋은 강의 감사드립니다.

답변 1

3

정수원님의 프로필 이미지
정수원
지식공유자

네 

RoleHierachy 엔터티가 하는 목적이 Role 의 목적에 따라 사용자별로 계층적 권한을 부여하겠다 라는 의미입니다.

그렇기 때문에 RoleHierachy 엔터티가 그 목적에 부합하도록 상위 권한과 하위권한의 개념을 담아야 하고 테이블과 매핑되도록 구성한 것입니다.

twosome 님께서 구현하신 방식도 깔끔한 처리이긴 하지만  어떤 방식으로 하는 것이 더 개발 효율성이나 관리측면에서 더 나을 것인지 판단해서 결정해야 한다고 봅니다.

그리고 RoleHierachy 엔터티로 할것인지 Role 과 RoleGrade 를 조합해서 할 것인지 판단하실 때 참고하실 것은  클래스의 역할과 책임을 할당할 떄  어떤 것을 선택하는 것이 더 클래스의 정의와 부합되는지 고려하시면 됩니다.

그리고 상위 권한의 사용자가 하위 권한의 모든 것에 접근이 가능할 수도 있지만 권한을 어떻게 설정하느냐에 따라서 상위권한이라 할지라도 일부 특수한 하위권한에는 접근이 안되도록 해야 할 수도 있습니다.

그 권한은 최상위 관리자와 하위 관리자 본인만 접근이 되어야 할 수도 있기 때문에 그렇습니다.

그럴 경우에도 N:N 이 필요하지 않는지는 한번 체크해 보시기 바랍니다.

twosom님의 프로필 이미지
twosom
질문자

감사합니다. 덕분에 궁금증이 시원하게 해결되었습니다. 

twosom님의 프로필 이미지
twosom

작성한 질문수

질문하기