inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 시큐리티

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

궁금한 점이있습니다.

267

Na Seunghoo

작성한 질문수 7

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;
}
}

 

spring-boot java Spring Security

답변 1

0

정수원

답변이 늦어 죄송합니다.

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

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

시큐리티 공부 버전 질문

0

188

1

[해결 방법] MethodSecurityConfig.customMethodSecurityMetadataSource() 호출하지 않는 이슈

0

196

1

AbstractSecurityInterceptor.class.beforeInvocation()를 2번 실행하는 경우

0

186

1

강의 코드가 왜이렇게 뒤죽박죽인가요...

0

270

1

메인 페이지로 접속해도 login url로 리다이렉트가 되지 않습니다..

0

247

1

파라미터값이 넘어가지 않습니다 ....

0

381

1

security filterChain 설정 질문이 있습니다.

0

336

1

소스 부분 질문 드립니다.

0

213

2

섹션4 7번 강의 문제가 있는거 같네요.

0

351

2

파일이 수시로 이름이 바껴있네요 ㄷㄷ

0

309

1

HttpSessionSecurityContextRepository를 사용안하는 문제

0

563

2

error , exception 이 잘 안됩니다.

0

288

2

thymeleaf tag 질문합니다.

0

200

2

버전업하면서 deprecated된 것들이 너무많아요

0

482

1

spring security 패치 관련

0

442

1

모바일을 사용할때 토큰말고 세션

0

863

2

DB 연동한 인가 부분에 대한 질문입니다!

0

268

1

Ajax방식도 똑같이 Session방식을 사용하는건가요?

0

312

1

Config 파일 생성 시 질문이 있습니다.

0

236

1

강사님 몇일동안 구글 검색만 100개 했는데도 이유를 모르겠습니다..

1

440

2

403 에러 뜹니다.

0

818

2

login_proc의 존재에 대한 간략한 설명입니다

0

280

1

top.html에 로그인 링크를 만들어서 로그인을 해봤습니다

0

290

2

안녕하세요. DB에 저장될 때 이해 안 가는 값이 있어서 질문드립니다!

0

194

1