security의 test는 다른 부분이 존재한다.
user가 로그인을 가정하고 test해야 하는 경우가 많은데, 이때
인증을 받지 않고 test를 한다면 동작 자체가 금지된다.
Spring-security-test로 Mock user를 생성, 인증시켜놓고 test를 진행한다.
mockmvc를 통해, SpringSecurity를 적용시킬 수 있다.
@WithMockUser
MockUser를 생성 후 , 인증을 만든다.
userdetails를 직접 구현할때는 (Custom User)가 있는 경우에는, 에러가 발생할 수 있음에 주의하자
그 이유는 withmock user의 user는 userdetails의 user이고, custom user와 다른 User이기 때문에.
대부분의 경우에 동작하며 , 훨씬 간단하게 사용이 가능.
@WithUserDetails
-> 가짜 user를 가져올때, userdetailsservice의 loaduserbyusername을 통해 User를 가져와서
test용 User를 생성한다. (넣어주는 방식이다)
value는 그렇기 때문에 username, Beanname은 해당 userdetailsservice의 구현(현재는 loaduserbyusername을 override 하지 않았기 때문에 그대로 userdetailsservice를 사용했다. SetupBefore는 유저의 세팅 타이밍을 지정해주었다.
(허나, admin123과 같은 user는 존재하지 않기 때문에 , 넣어줄수가 없으므로, repository를 통해 save해 실제 db에 넣고 그 이후에 사용해야 한다)
실제 예시를 , NoticeControllerTest를 통해 완성해 보겠다.
ACtiveprofiles("Test")는, properties에서 test로 그룹화된 설정을 사용하겠다는 의미가 된다 .
요청을 받을 mockMvc를, 매 test 직전에 생성해 준다는 의미.
apply(springsecurity)는 위에서 작성한대로, 스프링 시큐리티를 적용하겠다는 의미가 된다 .
mockmvc(가짜요청)이 왔을때, 인증이 없다면 redirection으로 , login으로 갈 것임을 test하였다.
만약 인증이 있음을 표현하고 싶다면, WithMockUser를 통해 특정 권한이 있는 , admin이든 user이든 , 권한만 있다면 notice에 접근할 수 있게끔 하였다.
WIth Mock User를 통해 가짜 admin을 만들었고, 해당 admin이 notice에 접근한다면 (with(csrf))에 주의하자 . csrf token을 통해 인증받는데 도움을 받기 때문이다. ) (csrf는 특정 role에 대한 test시 반드시 필요하다 )
해당 요청이 post이기 때문에, medaitype이 application_form_urlencoded여야 하며 (body가 있을땐 필수적)
paramater로는 title과 content를 보내고, 그 응답은 redirection과, notice로의 redirectedurl을 기대한다.