-
[스프링] 시큐리티 - 7 (AccessDecisionManager)Spring 2020. 10. 11. 16:25
- 참고 : 인프런 >>스프링 시큐리티 (백기선 강의)
인증 ? AuthenticationManager
인가 ? AccessDecisionManager
AccessDecisionManager
Access Control 결정을 내리는 인터페이스로 여러개의 voter를 가질 수 있다. 여러 목록의 voter를 거치면서 유효한 지 확인
스프링 시큐리티가 기본적으로 3개의 인터페이스 구현체를 제공
- AffirmativeBased: 여러 Voter중에 한명이라도 허용하면 허용. 기본 전략.
- ConsensusBased: 다수결
- UnanimousBased: 만장일치
* AccessDecisionVoter
특정 오브젝트에 접근 할 때, 만족하는지 확인
- WebExpressionVoter: 웹 시큐리티에서 사용하는 기본 구현체, ROLE_Xxxx가 매치하는지 확인.
-
RoleHierarchyVoter: 계층형 ROLE 지원. ADMIN > MANAGER > USER
AccessDecisionManager 커스터마이징
계층형 ROLE 설정
@Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig extends WebSecurityConfigurerAdapter { public AccessDecisionManager accessDecisionManager() { RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl(); roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER"); DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler(); handler.setRoleHierarchy(roleHierarchy); WebExpressionVoter webExpressionVoter = new WebExpressionVoter(); webExpressionVoter.setExpressionHandler(handler); List<AccessDecisionVoter<? extends Object>> voters = new ArrayList<>(); voters.add(webExpressionVoter); return new AffirmativeBased(voters); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .mvcMatchers("/", "/info", "/account/**").permitAll() .mvcMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated() .accessDecisionManager(accessDecisionManager()); http.formLogin(); http.httpBasic(); } }
'Spring' 카테고리의 다른 글
[스프링] 시큐리티 -6 (Filter) (0) 2020.10.11 [스프링] 시큐리티 -5 (Authentication Manager) (0) 2020.10.10 [스프링] 시큐리티 -4 (SecurityContextHolder) (0) 2020.10.09 [스프링] 시큐리티 -3 (Test) (0) 2020.10.09 [스프링] 시큐리티 - 2 (DB 연동) (0) 2020.10.05 댓글