• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

궁금한 점이있습니다.

22.01.05 15:07 작성 조회수 193

0

안녕하세요 강사님
 
이번 강의를 보면서 한 가지 궁금한점 생겼습니다.
 

커스텀하다가 궁금하여 질문드립니다.

 
[요구사항 ]
 
사용자는 등록된 IP인경우 접근이 가능하다
사용자는 해당 권한 계층 상위 또는 해당 계층인 경우 접근이 가능하다.
사용자는 해당 부서계층에 상위 또는 해당 계층인경우 접근이 가능하다.
 
[사용자 권한 ]
ADMIN > MANAGER > USER
 
[팀 권한]
영업팀 > 1팀
 
위와 같이 권한 뿐만아닌 부서에 대한 정보까지 탐색해야한다면 어떻게 해야할지에 대해 문의드립니다.
 
[설계]
1. IP vote 같은 경우 ip가 존재한다면 ACCESS_ABSTAIN 보류 상태로 다음 vote를 체크하도록합니다. (강의와 동일)
 
2. 사용자 권한 - 사용자 계층은 해당 계층 또는 상위 계층이면 ACCESS_ABSTAIN 로 보류해야한다.
- 기본으로 제공하는 RoleVoter를 통해 승인 여부를 결정하는데 해당 결정 방법은 보류가 아닌 승인이기 때문에 재정의해서 보류로 변경한다.
 
2-1. 기존 RoleHierarchyVoter 를 상속한 CustomRoleHierarchVoter 를 생성한다
- vote 메소스를 재정의하여 ACCESS_ABSTAIN 처리 함으로써 사용자권한에 대한 부분에대한
 
문제점---------------------------------------------
 
3. RoleHierarchyVoter 를 상속한 GroupVoter 를 하나 생성해서 vote 메소드를 재정의해서 그룹에 대한 심사를 결정하고자합니다.
 
강의 기준에서 Group에대한 정보를 FilterSeuicrityInterceptor 에서 가져오게 하기 위해 SecurityInitializer 를 이용 데이터를 맵핑하고 빈을 설정했습니다.
 
4. 하지만 내부적으로 동작시 FilterSecurityInterceptor는 최초에 한번 해당 정보를 가져오는 과정을 진행하고AbstractSecurityInterceptor 에서 호출시에는 사용자의 권한정보만을 AccessDesisionManager에게 decide 하게 되는데요 결론적으로는 GroupVoter 에서는 권한정보가 사용자 정보를 가지고있어서 원하는 방향성으로 동작하지 않았습니다.
 
5. 이 경우 생각해볼 방향성이 provider 시점에 유저에 대한 정보를 조회 후 해당 정보중 그룹 정보도 같이 조회하여 WebAuthenticationDetails 에 그룹 정보를 포함하는 방법도
 
6.  AffirmativeBased 클래스를 재정의하여 해당 GroupVoter를 호출할 때 configAttributes 에 대한 db 정보를 가져오는방법 (역할이 변질되는 느낌이 있어보입니다.)
 
7. FilterSecurityInterceptor 에서 AbstractSecurityIntercepter에서 beforeInvocation 부분을 재정의 하는 방법 이 있을 것 같습니다.


8. 만약 Groupvoter 정보를 캐싱하고자 한다면 어느시점이 좋을까요.

 
 
 
 
[코드]
시큐리티 설정 코드
private List<AccessDecisionVoter<?>> getAccessDecisionVoters() {

List<AccessDecisionVoter<? extends Object>> accessDecisionVoters = new ArrayList<>();

accessDecisionVoters.add(accessIp());
accessDecisionVoters.add(roleVoter());
accessDecisionVoters.add(groupVoter());

return accessDecisionVoters;
}

@Bean
public AccessDecisionVoter<? extends Object> accessIp() {
return new IpAddressVoter(securityResourceService);
}

@Bean
public AccessDecisionVoter<? extends Object> roleVoter() {
return new CustomRoleHierarchyVoter(roleHierarchy());
}

@Bean
public RoleHierarchy roleHierarchy() {
return new RoleHierarchyImpl();
}

@Bean
public AccessDecisionVoter<? extends Object> groupVoter() {
return new GroupVoter(roleGroupHierarchy());
}

@Bean
public RoleHierarchy roleGroupHierarchy() {
return new RoleHierarchyImpl();
}

CustomRoleHierarchyVoter 

-  기존 RoleVoter에서 승인 처리되는 부분을 보류 상태로 변경했습니다.

public class CustomRoleHierarchyVoter extends RoleHierarchyVoter {

public CustomRoleHierarchyVoter(RoleHierarchy roleHierarchy) {
super(roleHierarchy);
}

@Override
public int vote(Authentication authentication, Object object,
Collection<ConfigAttribute> attributes) {
if (authentication == null) {
return ACCESS_DENIED;
}
Collection<? extends GrantedAuthority> authorities = extractAuthorities(authentication);
for (ConfigAttribute attribute : attributes) {
if (this.supports(attribute)) {
// Attempt to find a matching granted authority
for (GrantedAuthority authority : authorities) {
if (attribute.getAttribute().equals(authority.getAuthority())) {
return ACCESS_ABSTAIN;
}
}
}
}
return ACCESS_DENIED;
}

Collection<? extends GrantedAuthority> extractAuthorities(Authentication authentication) {
return authentication.getAuthorities();
}
}

 

GroupVoter

- 그룹 정보에 따른 승인 처리 부분입니다. 

해당 부분에서 그냥 DB 정보를 가져와서 Map에다가 저장해서 처리해볼까 하는 생각도 있는데 확실치가 않네요 .. 

public class GroupVoter extends RoleHierarchyVoter {

public GroupVoter(RoleHierarchy roleHierarchy) {
super(roleHierarchy);
}

@Override
public int vote(Authentication authentication, Object object,
Collection<ConfigAttribute> attributes) {
// 미구현
return result;
}
}

 

답변 1

답변을 작성해보세요.

0

답변이 늦어 죄송합니다.

질문에 대한 내용을 이해는 했지만 저도 직접 소스를 확인하고 실행하면서 해결방안을 찾아봐야 될 것 같습니다.

죄송하지만 github 소스 공유가 될까요?