spring security

김효준·2023년 11월 28일
0

수업정리

목록 보기
39/41

스프링 시큐리티 도입하자마자 모든 페이지에대해서 인증을 필요로함

SecurityFilterChain을 만들면 디폴트 설정꺼진다.

@Configuration
public class SecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        return http.build();
    }
}

메서드 안에서 아무것도 안하니 디폴트 설정을 끄는 효과
하지만 csrf체크는 한다.
csrf끄는방법 세가지

http.csrf(csrf-> csrf.disable()); 
  <form class="flex flex-col gap-4" method="POST" onsubmit="submitLoginForm(this); return false;">
    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">

post보내는 폼안에 csrf토큰을 넣어서 함께보낸다.
하지만 이것도 생략가능하다

폼안에 th:action 이것만 붙여주면 됨(룰이니 외울걸)
form 에서 method 가 POST 이고 th:action 속성이 있다면 csrf 토큰은 자동동봉된다.

    <form class="flex flex-col gap-4" method="POST" th:action="|/member/login|" onsubmit="submitLoginForm(this); return false;">
      //폼 전송시에 본인이 본인에게 보낼때, th:action="" 는 안되고 th:action 은 된다.
          <form th:action class="flex flex-col gap-4" method="POST" onsubmit="submitModifyForm(this); return false;">

룰이다

@Configuration
public class SecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        return http
                .formLogin(
                        formLogin -> formLogin
                                .loginPage("/member/login") //폼의 위치
                                .loginProcessingUrl("/member/login") //폼 전송 위치
                                .usernameParameter("username")
                                .passwordParameter("password")
                                .defaultSuccessUrl("/article/list")
                )
                .build();
    }
}

.loginPage("/member/login")
.loginProcessingUrl("/member/login") //이거 두개 위치 같으면 생략가능
.usernameParameter("username")
.passwordParameter("password")
기본이 username, password라서 이것도 생략가능


@Service
@RequiredArgsConstructor
public class CustomUserDetailService implements UserDetailsService {
    private final MemberService memberService;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Member member = memberService.findByUsername(username).get();
        return new User(member.getUsername(),member.getPassword(), member.getAuthorities());
    }
}

스프링 시큐리티가 세션에 데이터를 저장하는 방법을 따른다.
스프링 시큐리티한테 member 클래스가 로그인관련 클래스인것을 가르쳐주는것.,

// 20231128175601
// http://localhost:8021/home/session

{
  "SPRING_SECURITY_CONTEXT": {
    "authentication": {
      "authorities": [
        {
          "authority": "ROLE_MEMBER"
        }
      ],
      "details": {
        "remoteAddress": "0:0:0:0:0:0:0:1",
        "sessionId": "339B74BA8B0F6DBB74251CB7DFE30C75"
      },
      "authenticated": true,
      "principal": {
        "password": null,
        "username": "user1",
        "authorities": [
          {
            "authority": "ROLE_MEMBER"
          }
        ],
        "accountNonExpired": true,
        "accountNonLocked": true,
        "credentialsNonExpired": true,
        "enabled": true
      },
      "credentials": null,
      "name": "user1"
    }
  }
}

@PreAuthorize를 통해서 기존 구현했던 인터셉터들을 대체한다.
스프링 시큐리티에서 제공하는 각 액션마다 isAnonymous등을 이용한다. 로그인 안한사람만 들어오는 등 스토리보드를 짤수있다.
isAuthentication등~~
시큐리티컨피그 클래스에 @EnableMethodSecurity를 추가해준다. 이건 룰
관리자의 경우 @PreAuthorize("hasRole('ADMIN')") 오소리티를 가지고있는 브라우저만 접근가능

hasRole("ADMIN") = hasAuthority("ROLE_ADMIN")

0개의 댓글