12월6일 수요일 TIL

장숭혁·2023년 12월 5일
0

TIL작성

목록 보기
25/60
package com.sparta.myselectshop.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@Configuration // 아래 설정을 등록하여 활성화 합니다.
@EnableJpaAuditing // 시간 자동 변경이 가능하도록 합니다.
public class JpaConfig {
}
  • @Configuration : 자바 기반 설정 클래스를 표시하는데 사용된다. spring 애플리케이션의 설정을 포함하고 , 빈의 생성 및 관리를 담당하는 역할

  • @EnableJpaAuditing : JPA 엔티티에 대한 감시 설정을 활성화 한다. 엔티티의 생성일자, 수정일자 등을 자동으로 관리하기 위해 사용된다.

    • @CreatedDate : 생성 시간 자동 저장
    • @LastModifiedDate : 자동으로 수정시간 저장
@Configuration
@EnableWebSecurity // Spring Security 지원을 가능하게 함
@RequiredArgsConstructor
public class WebSecurityConfig {

    private final JwtUtil jwtUtil;
    private final UserDetailsServiceImpl userDetailsService;
    private final AuthenticationConfiguration authenticationConfiguration;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }

    @Bean
    public JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
        JwtAuthenticationFilter filter = new JwtAuthenticationFilter(jwtUtil);
        filter.setAuthenticationManager(authenticationManager(authenticationConfiguration));
        return filter;
    }

    @Bean
    public JwtAuthorizationFilter jwtAuthorizationFilter() {
        return new JwtAuthorizationFilter(jwtUtil, userDetailsService);
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // CSRF 설정
        http.csrf((csrf) -> csrf.disable());

        // 기본 설정인 Session 방식은 사용하지 않고 JWT 방식을 사용하기 위한 설정
        http.sessionManagement((sessionManagement) ->
                sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        );

        http.authorizeHttpRequests((authorizeHttpRequests) ->
                authorizeHttpRequests
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
                        .requestMatchers("/").permitAll() // 메인 페이지 요청 허가
                        .requestMatchers("/api/user/**").permitAll() // '/api/user/'로 시작하는 요청 모두 접근 허가
                        .anyRequest().authenticated() // 그 외 모든 요청 인증처리
        );

        http.formLogin((formLogin) ->
                formLogin
                        .loginPage("/api/user/login-page").permitAll()
        );

        // 필터 관리
        http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class);
        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }
}

-@WebSecurityConfig : Spring Security를 설정하는 데 사용된다. Spring Security 사용하여 애플리케이션의 보안 요구 사항을 처리하고 있다.

  • @EnableWebSecurity : Spring Security지원을 활성화 한다. 이 클래스가 Spring Security 설정을 담당하는 클래스임을 나타낸다.
  • passwordEncoder() : 이 메소드는 PasswordEncoder 빈을 생성하여 비밀번호를 안전하게 해싱하는데 사용된다. bcryptPasswordEncoder를 사용하여 비밀번호를 암호화한다.
  • authenticationManager() : 이 메서드는 Spring Security의 - AuthenticationManager 빈을 생성한다. 사용자 인증을 관리하는데 사용한다.
  • jwtAuthenticationFilter(): jwt를 사용하여 사용자의 권한을 확인하는 필터를 생성한다. 주어진 JWT를 통해 사용자의 인가를 관리한다.
  • securityFilterChain() : 이 메서드는 Spring Security의 SecurityFilterChain을 생성하며, HttpSecurity를 통해 여러 보안 설정을 구성한다. CSRF 설정, 세션 관리, 요청 권한 설정, 로그인 페이지 지정 등의 작업을 수행한다. 또한 , 필터들을 관리하고 적절한 위치에 추가하여 요청을 처리한다.
public class UserDetailsImpl implements UserDetails {

    private final User user;

    public UserDetailsImpl(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        UserRoleEnum role = user.getRole();
        String authority = role.getAuthority();

        SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(simpleGrantedAuthority);

        return authorities;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
  • Spring Security에서 사용자 정보를 제공하는 UserDetails 인터페이스의 구현체인 UserDetailsImpl 클래스이다. 주로 사용자의 인증 정보를 담고 있는 객체를 Spring Security에 제공하기 위해 구현한다.

  • UserDetailsImpl(User user): UserDetailsImpl 생성자로 주어진 User 객체를 이용하여 사용자 정보를 초기화한다.

  • getPassword(): Spring Security의 UserDetails 인터페이스에 정의된 메서드로, 사용자의 비밀번호를 반환한다. 보통은 User 객체에서 비밀번호를 가져와 반환한다.

  • getUsername(): 마찬가지로 UserDetails 인터페이스에 정의된 메서드로, 사용자의 이름(또는 아이디)를 반환한다.

  • getAuthorities(): 사용자의 권한 정보를 제공한다. 보통은 User 객체에 정의된 역할 정보를 이용하여 GrantedAuthority를 생성하고 이를 컬렉션으로 반환한다.

  • isAccountNonExpired(), isAccountNonLocked(), isCredentialsNonExpired(), isEnabled(): 각각 사용자 계정의 만료 여부, 잠금 여부, 자격 증명의 만료 여부, 사용 가능 여부를 반환한다. 일반적으로 true로 설정하여 계정의 유효성을 확인한다.

UserDetailsImpl(User user)

  • 이 클래스가 UserDetails 인터페이스를 구현하여 Spring Security에 의해 요구되는 사용자 정보를 제공한다는 것을 의미한다. Spring Security는 사용자 인증 및 권한 부여를 수행하는데, 이를 위해서는 사용자 정보를 정확하게 알아야 한다. UserDetails 인터페이스를 구현한 클래스가 필요하다.
  • 클래스가 제공하는 메서드들이 Spring Security에 의해 사용되어 사용자 정보를 올바르게 처리하고, 사용자를 인증하고 권한을 관리할 수 있게 도와준다 이 클래스는 Spring Security에 의해 호출되어 인증 및 권한 관리에 필요한 사용자 정보를 제공하고, Spring Security가 이 정보를 활용하여 인증 및 권한 부여 작업을 수행할 수 있도록 한다.
profile
코딩 기록

0개의 댓글

관련 채용 정보