이번 시간에는 기본 시큐리티 설정을 해 볼 것이다.
먼저 Controller 를 수정하여 여러 함수를 추가하여 테스트해보고
스프링 시큐리티 필터를 생성하여 테스트 해볼 것이다.
package com.cos.securiy1.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // View Return
public class IndexController {
@GetMapping({"","/"})
public String index(){
// 머스테치 기본폴더 src/main/resources/
// ViewResolver 설정 : templates (prefix) , mustache(suffix) - 생략 가능.
return "index"; // src/main/resources/templates/index.mustache 를 찾게된다.
}
@GetMapping("/user")
public String user(){
return "user";
}
@GetMapping("/admin")
public String admin(){
return "admin";
}
@GetMapping("/manager")
public String manager(){
return "manager";
}
// 스프링 시큐리티가 해당 주소를 낚아챈다.
@GetMapping("/login")
public String login(){
return "login";
}
@GetMapping("/join")
public String join(){
return "join";
}
@GetMapping("/joinProc")
public @ResponseBody String joinProc(){
return "회원가입 완료됨!";
}
}
이전 시간에 구성한 index 페이지에 user, admin, manager, login, join, joinProc 함수를 추가 하였다.
login은 스프링 시큐리티가 주소를 낚아채 우리가 생성한 login 페이지가아닌 지난 시간에 나온 로그인 페이지가 나오게 되었다.
localhost:8080/user
localhost:8080/admin .....
다음과 같이 입력하며 화면이 잘 나오는지 테스트한다.
package com.cos.securiy1.config;
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.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity // 활성화 , 스프링 시큐리티 필터가 스프링 필터 체인에 등록
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // 비활성화
http.authorizeRequests()
.antMatchers("/user/**").authenticated() // 다음과 같은 주소는 인증이 필요
.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") // 인증뿐 아니라 권한이 있어야함
.anyRequest().permitAll() // 다른 것은 모두 허용
.and()
.formLogin()
.loginPage("/login"); // 로그인 페이지 설정
}
}
다음 코드와 같이 스프링 시큐리티 필터를 설정하였다.
http.csrf() 는 정상적인 사용자가 의도치 않는 위조요청을 보내는것을
막기 위해서 html에서 csrf 토큰이 포함되어야만 요청을 받는것이다.
하지만 우리는 비활성화를 하기로 하였다. 이유는 rest api에서는
csrf의 공격으로 부터 안전하고 매번 csrf 토큰을 받는것은 불필요하다고 생각되기 때문이다
authorizeReuquests를 통해 다음을 설정하였다.
/user 주소로 시작되는 주소는 인증이 필요하며
/manager, /admin 주소로 시작되는 주소는 인증과 권한이 모두 필요하다
그 이외에 것은 모두 허용하며
로그인 페이지를 설정하여 비로그인시 로그인 화면으로 가도록 하였다.