๐ฐ์ค๋ ๊ฐ์ธ ํ๋ก์ ํธ๋ก ์ํ๋ฆฌํฐ๋ฅผ ์ฐ์ตํ๋์ค nullpointexception์ด ๋ฐ์ํ์๋ค. ์๋๋ ๊ทธ ์ฝ๋์ด๋ค.
@GetMapping("/modify/{id}")
public String questionModify(QuestionForm questionForm,
@PathVariable Long id,
@AuthenticationPrincipal PrincipalUser auth) {
log.info("authentication ={}", auth); <--EXCEPTION
...์๋ต
}
๐ค์ฒ์์๋ ์ดํด๊ฐ ๊ฐ์ง ์์๋ค. ๋ถ๋ช authentication๊ฐ์ฒด๋ฅผ ์ ๋๋ก ๋ฐํํ๋๋ก ๋ง๋ค์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋๋ ๊ทธ ๋ฐํ ์ฝ๋๋ค์ด๋ค
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = (String) authentication.getCredentials();
PrincipalUser userDetails = (PrincipalUser) userSecurityService.loadUserByUsername(username);
if (!passwordEncoder.matches(password, userDetails.getPassword())) {
throw new BadCredentialsException("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์น ํ์ง ์์ต๋๋ค.");
}
return new UsernamePasswordAuthenticationToken(userDetails.getUsername() , userDetails.getPassword(), userDetails.getAuthorities());
}
๐คจ์ ์ฝ๋์์ PincipalUser๋ OAuth2User์ UserDetails๋ฅผ ๊ตฌํํ๊ณ ์๋ ์ฝ๋์ด๋ค. ๊ทธ๋์ provider์์ ๋ฐํ์ UsernamePasswordAuthenticationToken์ ๋ด์ ๋ฐํํ๋๋ก ํ์๋๋ฐ ๊ณ์ null๊ฐ์ด ๋ค์ด์ค๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ฒ์์๋ UsernamePasswordAuthenticationToken์ด ์ ๋๋ก ๋ค์ด๊ฐ์ง ์์ ๊ฒ ๊ฐ์ ๋๋ฒ๊ทธ๋ก ๋๋ ค ๋ณด์๋ค.
๋ง์ฝ ๋ค์ด๊ฐ์ง ์์๋ค๋ฉด SecurityContext์๋ ์ ํ ํฐ๊ฐ์ด ๋ค์ด๊ฐ์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๐ซฅ๊ทธ๋ฌ๋ ์์ฐจ๋ก ํ์ธํด ๋ณด์๋ ์ธ์ฆ ๊ฐ์ฒด๋ ์ ๋๋ก ๋ค์ด๊ฐ๋ค.
๐๊ทธ๋์ ์๋ง์ ๊ตฌ๊ธ๋ง์ ํตํด ํ ๋ธ๋ก๊ฑฐ ๋์ ๊ธ์ ํตํด ์์ธ์ ์ ์ ์๊ฒ ๋์๋ค.
์ด์ ๋ ๋ฐ๋ก UsernamePasswordAuthenticationToken์ ์ฒซ๋ฒ์งธ ์์ฑ์์ String์ธ getUsername๊ฐ์ ๋ฃ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ก ์ธํด @AuthenticationPrincipal์๋ String ๊ฐ์ด ๋ค์ด์ค๊ฒ ๋๊ณ PrincipalUser์๋ ํ์ ์ด ๋ง์ง ์์ ๊ฐ์ด null์ด ๋ค์ด๊ฐ๊ฒ ๋ ๊ฒ์ด์๋ค.๊ทธ๋์ ์๋์ ์ฝ๋๋ก ๊ณ ์น ๊ฒฐ๊ณผ ์ ๋๋ก ๋ principal๊ฐ์ด ๋ค์ด๊ฐ๋ค.
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = (String) authentication.getCredentials();
PrincipalUser userDetails = (PrincipalUser) userSecurityService.loadUserByUsername(username);
if (!passwordEncoder.matches(password, userDetails.getPassword())) {
throw new BadCredentialsException("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์น ํ์ง ์์ต๋๋ค.");
}
//์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ด๊ฐ ๋ง๋ Principal๊ฐ ๋ฃ๊ธฐ
return new UsernamePasswordAuthenticationToken(userDetails , userDetails.getPassword(), userDetails.getAuthorities());
}
์๋ ๋ธ๋ก๊ฑฐ๋ ์๋์์ผ๋ฉด ๋ง์ ์๊ฐ์ ํด๋งธ์ ๊ฒ ๊ฐ๋ค.
์ฐธ๊ณ ๋ธ๋ก๊ทธ: Jemni