@Controller
public class IndexController {
@GetMapping({"","/"})
public String index(){
return "index";
}
@GetMapping("/user")
public @ResponseBody String user(){
return "user";
}
@GetMapping("/admin")
public @ResponseBody String admin(){
return "admin";
}
@GetMapping("/manager")
public @ResponseBody String manager(){
return "manager";
}
//스프링 시큐리티가 로그인 url을 낚아챈다.
@GetMapping("/login")
public @ResponseBody String login(){
return "login";
}
@GetMapping("/join")
public @ResponseBody String join(){
return "join";
}
@GetMapping("/joinProc")
public @ResponseBody String joinProc(){
return "회원관리 완료";
}
}
이전 글에서 만들었던 컨트롤러에 아래 메소드들을 추가한다.
/user면 user /admin이면 admin 잘 나오는데
/login을 url로 입력하면 우리가 원하는 login이 아닌 시큐리티 로그인 창이 뜬다. > Security가 login을 가로챘다.
이번에는 이 문제를 해결하고 user 페이지는 user만 접근가능하도록 admin페이지는 admin만 접근가능하도록 하는 등의 설정을 해보자.
package com.cos.security1.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/**").authenticated()
.antMatchers("/manager/**").access("hasAnyRole('ROLE_MANAGER','ROLE_ADMIN')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll();
return http.build();
}
}
@EnableWebSecurity
어노테이션을 붙이면 스프링 시큐리티 필터가 스프링 필터 체인에 등록된다.
이렇게하고 서버를 실행시키면
로그인 페이지가 뜨던 어제와 달리 인덱스 페이지가 뜨는 것을 확인할 수 있다.
하지만 권한 설정을 한 user, admin, manager로 이동하면 403에러가 뜬다.
그리고 이전과 달리 잘 나오는 로그인(내가만든) 페이지
SecurityConfig 파일 생성 후 권한을 설정하니 시큐리티 login이 작동 안함
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/**").authenticated()
.antMatchers("/manager/**").access("hasAnyRole('ROLE_MANAGER','ROLE_ADMIN')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login");
return http.build();
}
이렇게 하고나면 url에 user, admin, manager을 쳐도
로그인 페이지가 호출된다.