์Šคํ”„๋ง/์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ

KIMHYEYUN 2022. 11. 21. 20:15
๋ฐ˜์‘ํ˜•

๐Ÿš€ ์ฐธ๊ณ ํ•œ ์ฑ…์—์„œ๋Š” WebSecurityConfigureAdapter๋ฅผ ํ†ตํ•ด security config๋ฅผ override ํ–ˆ์ง€๋งŒ, ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฒ„์ „์—์„œ๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ!!

UserDetailService

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํšŒ์› ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • loadUserByUsername() ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด์™€ ๊ถŒํ™˜์„ ๊ฐ–๋Š” UserDetail ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ˜ํ™˜

UserDetail

  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ํšŒ์›์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

MemberService


@RequiredArgsConstructor
@Service
@Transactional
public class MemberService implements UserDetailsService {

    /** ์ƒ๋žต **/ 

    @Override
    public UserDetails loadUserByUsername(String memberId) throws UsernameNotFoundException {
        Member member = memberRepository.findByMemberId(memberId);

        if (member == null) {
            throw new UsernameNotFoundException(memberId);
        }

        return User.builder()
                .username(member.getMemberId())
                .password(member.getPassword())
                .roles(member.getRole().toString())
                .build();
    }
}

SecurityFilterChanin Bean ๋“ฑ๋ก

์Šคํ”„๋ง ๊ณต์‹ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์„ค์ •

@EnableWebSecurity
@RequiredArgsConstructor
@Configuration(proxyBeanMethods = false)
@ConditionalOnDefaultWebSecurity
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
    @Autowired
    MemberService memberService;

    @Bean
    @Order(SecurityProperties.BASIC_AUTH_ORDER)
    public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
        http
                .csrf().disable()
                .headers().frameOptions().disable()
                .and()
                .authorizeRequests()
                .antMatchers("/", "/css/**", "/images/**", "/js/**", "/h2-console/**", "/member/**").permitAll()
                .antMatchers("/", "/members/**").permitAll()
                .and()
                .formLogin()
                .loginPage("/members/login")
                .defaultSuccessUrl("/").permitAll()
                .usernameParameter("memberId")
                .failureUrl("/members/login/error")
                .and()
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/members/logout"))
                .logoutSuccessUrl("/");

        return http.build();

    }

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

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }
}
  • http.formLogin() - http๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” form ๊ธฐ๋ฐ˜ request๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ์ฒ˜๋ฆฌ

๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ

@SpringBootTest
@AutoConfigureMockMvc
@Transactional
@TestPropertySource(locations = "classpath:application-test.properties")
class MemberControllerTest {
    @Autowired
    private MemberController memberController;
    @Autowired
    private MockMvc mockMvc;

    @Test
    void ๋กœ๊ทธ์ธ_์„ฑ๊ณต_ํ…Œ์ŠคํŠธ() throws Exception {
        String memberId = "test";
        String password = "12345678";

        this.createMember(memberId, password);

        mockMvc.perform(formLogin().userParameter("memberId")
                .loginProcessingUrl("/members/login")
                .user(memberId).password(password)
        ).andExpect(SecurityMockMvcResultMatchers.authenticated());
    }

    private void createMember(String memberId, String password) {
        MemberFormDto memberFormDto = new MemberFormDto();
        memberFormDto.setMemberId(memberId);
        memberFormDto.setPassword(password);
        memberFormDto.setName("ํ…Œ์ŠคํŠธ");
        memberFormDto.setPostCode(2222);
        memberFormDto.setAddress("ํ…Œ์ŠคํŠธ");
        memberFormDto.setAdditionalAddress("ํ…Œ์ŠคํŠธ");

        memberController.join(memberFormDto);
    }


    @Test
    void ๋กœ๊ทธ์ธ_์‹คํŒจ_ํ…Œ์ŠคํŠธ() throws Exception {
        String memberId = "test";
        String password = "12345678";

        this.createMember(memberId, password);

        mockMvc.perform(formLogin().userParameter("memberId")
                .loginProcessingUrl("/members/login")
                .user(memberId).password("123456789")
        ).andExpect(SecurityMockMvcResultMatchers.unauthenticated());
    }

}


๊ถŒํ™˜์— ๋”ฐ๋ผ, ํ—ค๋”์— ๋‚˜ํƒ€๋‚˜๋Š” ๋ฉ”๋‰ด ๋ณ€๊ฒฝ

728x90
๋ฐ˜์‘ํ˜•