Spring Security 시큐리티 설정

바그다드·2023년 4월 2일
0

Spring Security

목록 보기
2/17

지난 번에는 환경설정 이후 로그인 화면이 뜨는 것까지 확인하였다.

logout

http://localhost:8080/logout

위 url을 입력하면 따로 메서드를 만들지 않았지만 로그아웃이 이뤄진다.

테스트용 메서드 추가

@Controller
public class IndexController {

    @GetMapping({"", "/"})
    public String index() {
        // 머스테치 기본폴더 src/main/resources
        // 뷰리졸버 설정 : templates (prefix), .mustache (suffix) 생략가능!!
        return "index"; // src/main/resources/tamplates/index.mustache
    }

    @GetMapping("/user")
    @ResponseBody
    public String user() {
        return "user";
    }

    @GetMapping("/manager")
    @ResponseBody
    public String manager() {
        return "manager";
    }

    @GetMapping("/admin")
    @ResponseBody
    public String admin() {
        return "admin";
    }

    // 스프링 시큐리티가 주소를 낚아채버림 - Security Config 파일 생성 후 작동 안함
    @GetMapping("/login")
    @ResponseBody
    public String login() {
        return "login";
    }

    @GetMapping("/join")
    @ResponseBody
    public String join() {
        return "join";
    }

    @GetMapping("/joinProc")
    @ResponseBody
    public String joinProc() {
        return "회원가입 완료됨!";
    }

}
  • 기존 controller에 메서드를 추가하였다.
  • 다른 메서드에 접근을 하면 return값들이 제대로 뜨지만 login에 접근하면 security가 이를 가로채 아래처럼 우리가 정의한 login이 아닌 security의 login페이지가 뜬다.
  • login은 우리가 정의한 login으로 접근하게 하고
  • 각 계정이 가진 권한에 따라 접근할 수 있는 메서드(페이지)를 제한해보자!

Security Config 추가

  • config 패키지에 아래의 클래스를 추가해주자
@Configuration
@EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록이 됨
public class SecurityConfig{

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/user/**").authenticated()
                .antMatchers("/manager/**").access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login");

        return http.build();
    }
}
  • 이제 logout을 하고 다시 http://localhost:8080로 접근을 해보자
  • 이전과 달리 login을 하지 않았음에도 인덱스 페이지로 접근이 되고,
  • user, manager, admin 등 권한이 필요로 하는 페이지에는 403 상태 에러가 발생한다.
  • login 페이지도 시큐리티에서 생성한 페이지가 아니라 내가 정의한 login메서드로 접근한다.

Security Config 수정

  • Security Config파일을 수정하고 프로젝트를 재시작해보자
@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/user/**").authenticated()
                .antMatchers("/manager/**").access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                .anyRequest().permitAll()
                // 추가
                .and()
                .formLogin()
                .loginPage("/login");

        return http.build();
    }
  • 이제 아래처럼 권한이 필요한 페이지에 접근을 시도하면
http://localhost:8080/user
http://localhost:8080/manager
http://localhost:8080/admin

  • 우리가 정의한 login페이지로 이동하게 된다.
profile
꾸준히 하자!

0개의 댓글