// admin이 user페이지에 접근 가능하게 설정
@Bean
RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
return roleHierarchy;
}
admin이 user페이지에 접근 가능하게끔 설정하는 코드이다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(request-> request
.antMatchers("/").permitAll()
.anyRequest().authenticated())
.formLogin(
login->login.loginPage("/login")
.permitAll() //무한루프 방지
.defaultSuccessUrl("/",false)
// 로그인후 갈때가 없으면 루트페이지로 이동
.failureUrl("/login-error")
.authenticationDetailsSource(customAuthDetails)
)
.logout(logout->logout.logoutSuccessUrl("/login"))
.exceptionHandling(
exception->exception.accessDeniedPage("/access-denied"))
;
}
코드 순서대로 누구든 루트페이지에는 접근하고 이하 페이지에 접근할경우 인증을 받아 들어가야 한다.
로그인 후 이동할 페이지가 없다면 루트 페이지로 돌아와 이동할 페이지를 선택하여 이동하게 끔 하는 설정으로
defaultSuccessUrl의 false부분을 true로 변경하면 무한루프에 빠질 수 있기 때문에 주의해야한다.
예를 들어 로그인을 하려고 하면 로그인후 이동하라며 루트페이지로 이동하고 루트페이지에서도 로그인후 이동하라며 로그인 페이지로 보내버리면서 무한루프에 던저질 가능성이 있다.
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.requestMatchers(
PathRequest.toStaticResources().atCommonLocations()
)
;
}
위 코드는 웹리소스에 대해 filter를 거치지 않게 하는 코드이다.
설정 하지않으면 js파일 등이 filter를 거치며 형식을 깨트려 원하지 않는 화면을 display하기 때문에 설정이 필요하다.
로그인을 하지 않은 사용자가 볼 수 있는 작업을 보여지지 않게 하기 위해서는 html파일에서 thymleaf를 이용한다.
<div class="link" sec:authorize="!isAuthenticated()">
<a href="/login"> 로그인 </a>
</div>
<div class="link" sec:authorize="isAuthenticated()">
<a href="/user-page"> 유저 페이지 </a>
</div>
sec:authorize="idAuthenticated()"를 설정하면 로그인 하지않은 사용자는 작업을 볼 수 없다.
위 코드를 예로 들자면 로그인 하지 않은 상태에서는 로그인만 확인
가능하고 유저페이지는 로그인을 해야 보인다.