오늘의 할일 : 로그인 및 로그아웃 기능 구현하기
Security를 설정하는 이유
- 로그인 페이지를 설정 해줘서 로그인을 하지않으면 못들어가는 페이지를 지정한다
- 사용자 인증 후 , 성공적인 로그인이나 실패한 로그인 처리를 설정할 수 있다
- 로그인한 사용자 세션을 관리하고, 세션 타임앗 등을 설정할 수 있다
- 사용자가 로그아웃할 떄의 동작을 설정 할 수 있어 로그아웃 후에 세션을 무효화 한다
그 외에도 많은 기능들이 있다 csrf, http 등,,,
@Bean 란
이 메서드는 리턴값을 Spring Container에 등록 하라는 뜻 즉 어떤 코드에 사용되면 그 코드에서 Spring의 빈으로 등록돼서 다른 곳에서 주입해서 사용할수있다
authorizeHttpRequests -> 로그인을 하지 않아도 들어갈수 있는 곳
formLogin -> 현재 로그인이 이루어지는 페이지 성공하면 "/" 로 이동
logout -> 로그아웃 세션 버튼을 눌러서 성고앟면 "/"로 이동
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/login", "/board_list","/sign", "/**").permitAll()
.anyRequest().authenticated())
.formLogin((formLogin) -> formLogin
.loginPage("/login")
.defaultSuccessUrl("/"))
.logout((logout) -> logout
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/")
.invalidateHttpSession(true))
;
return http.build();
}
AuthenticationManager - 로그인 유무를 체크 해준다
사용자 로그인 시, 입력한 ID/PW가 맞는지 검사하는 역할을 해.
내부적으로 UserDetailsService, PasswordEncoder 등을 통해 인증 과정을 수행해.
@Bean
AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
@Override 란
컴파일러가 정확하게 타자를 철자를 적었는지 체크 해주는것 toString O , toStng X 이런식으로 문법이나 철자가 틀리면 오류가 발생 오버드라이딩을 해줌
loadUserByUsername을 구현한 것
UserDetails loadUserByUsername(String username) -> !로그인 시 사용자가 입력한 아이디를 기반으로 해당 사용자의 정보를 DB에서 가져와 Spring Security에게 넘겨준다
유저가 있을경우 member.get() 객체를 가져옴 -> GrantedAuthority 타입으로 저장
username이 "admin"이면 관리자 권한(ROLE_ADMIN) 부여. 아니면 ROLE_USER 부여
return -> 여기서 생성한 객체가 Spring Security에 의해 인증 처리
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<Member> _member = this.memberRepository.findByUserId(username);
if(_member.isEmpty()){
throw new UsernameNotFoundException("사용자를 찾을 수 없습니다");
}
Member member = _member.get();
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
if("admin".equals(username)){
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
}else{
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_USER"));
}
return new User(member.getUserId(),member.getUserPassword(), grantedAuthorities);
}
로그인 안했을 때 -
로그인 했을 때 -