Spring Security.ch6

이호영·2022년 5월 12일
0

SpringSecurity

목록 보기
6/6

여러가지 설정

//    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()"를 설정하면 로그인 하지않은 사용자는 작업을 볼 수 없다.
위 코드를 예로 들자면 로그인 하지 않은 상태에서는 로그인만 확인
가능하고 유저페이지는 로그인을 해야 보인다.

0개의 댓글