본문 바로가기
spring

스프링 시큐리티 동적 작용

by improve 2025. 2. 6.

우선 필터 체인을 사용해 모든 사용자가 사용할 수 있게 할거냐 를 선택하였습니다.

여기서 post 값으로 register 를 사용해서 회원가입을 할 수 있게 만들어 봤습니다.

 

●ProjectSecurityConfig

@Bean
    SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
//        http.authorizeHttpRequests((requests) -> requests.anyRequest().permitAll());
//        http.authorizeHttpRequests((requests) -> requests.anyRequest().denyAll());
        http
                .csrf(csrfConfig -> csrfConfig.disable())
                .authorizeHttpRequests((requests) -> requests.requestMatchers("/myAccount","/myBalance","/myCards").authenticated()
                .requestMatchers("/notices", "/myloans","/error","/register").permitAll()
        );
        http.formLogin(withDefaults());
        http.httpBasic(withDefaults());
        return http.build();
    }

//    @Bean
//    public UserDetailsService userDetailsService(DataSource dataSource){
//        return new JdbcUserDetailsManager(dataSource);
//    }

    @Bean
    public PasswordEncoder passwordEncoder(){
//        return new BCryptPasswordEncoder();
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Bean
    public CompromisedPasswordChecker compromisedPasswordChecker(){
        return new HaveIBeenPwnedRestApiPasswordChecker();

    }

spring Security 에 구조에 대해 연관성이 높아서 해석하기에 어려움이 있었다.

 

● EasyBankDetailsServise

public class EasyBankUserDetailsService implements UserDetailsService {

    private final CustomerRepository customerRepository;

    @Override
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        Customer customer = customerRepository.findByEmail(email).orElseThrow(() ->
                new UsernameNotFoundException("등록된 이메일이 없습니다." + email));

        List<GrantedAuthority> grantedAuthorities = List.of(new SimpleGrantedAuthority(customer.getRole()));
        return new User(customer.getEmail(), customer.getPwd(),grantedAuthorities);
    }
}

이메일을 찾아서 없으면 에러문을 까지 보여지게 했다.

 

repository를 만들어서 데이터베이스 쿼리를 사용합니다 . 

Optional<Customer> findByEmail(String email);

간단한 select 문으로 where절에 email를 넣었다.

 

● UserController

@PostMapping("/register")
public ResponseEntity<String> registerUser(@RequestBody Customer customer){
    try {
        String hashPwd = passwordEncoder.encode(customer.getPwd());
        customer.setPwd(hashPwd);
        Customer saveCustomer = customerRepository.save(customer);
        if(saveCustomer.getId() > 0){
            return ResponseEntity.status(HttpStatus.CREATED)
                            .body("생성완료");
        } else {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                            .body("이메일을 잘못 입력했다");
        }
    }catch (Exception e){
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                        .body("생성 불가" + e.getMessage());

    }

}

 

PostMapping 을 통해 데이터를 보내주었고 try catch를 통해 변수를 잡았다.

여기선 RequestBody 를통해 Customer entity를 다 넣어주었다. 추후에 이 entity 를 다 넣는건 데이터 손해가 크기 때문에 

보강을 할 예정이다. 

'spring' 카테고리의 다른 글

tosspayment api 사용해보기  (0) 2024.04.18
SPRING HATEOAS/Security == Intercepter  (0) 2024.03.15
맥북에서 DBeaver spring 으로 연결  (0) 2024.03.01
spring pom.xml  (0) 2024.02.28
spring 등록 출력(복습)  (0) 2024.02.27