티스토리 뷰
(1)편에 이어서 2편을 작성하려한다.
2편은 AuthenticationProvider / Success,Failuer Handler를 다뤄보겠다.
AuthenticationProvider : 실제 인증 처리
@Component
class CustomAuthenticationProvider : AuthenticationProvider{
@Autowired
private lateinit var mapper : CommonMapper
override fun authenticate(authentication: Authentication?): Authentication {
val userid = authentication?.principal.toString()
val userpw = authentication?.credentials.toString()
val logger = LoggerFactory.getLogger(this::class.java)
mapper.getuserinfo(userid).also {user ->
if(user?.userpw.equals(userpw)) {
val authorities = listOf(SimpleGrantedAuthority("ROLE_USER"))
return UsernamePasswordAuthenticationToken(userid,userpw,authorities)
}else {
throw BadCredentialsException("비밀번호 오류 : BadCredentialsException")
}
}
}
override fun supports(authentication: Class<*>): Boolean {
return UsernamePasswordAuthenticationToken::class.java.isAssignableFrom(authentication)
}
}
1) authencate : 사용자가 입력한 인증 정보
principal : 사용자 id
credentials : 사용자 pw
2) mapper : 입력받은 id로 db를 조회해 계정정보의 유무를 판단한다.
SELECT
ID AS userid
,PW AS userpw
,EMAIL AS useremail
,NM AS usernm
,MEMCODE AS memcode
FROM MEMBER
WHERE
ID = #{userid}
**계정 정보 확인**
3) 계정정보를 확인하고, 입력받은 pw값과 db상의 pw를 비교해 일치여부에 따라
인증 / Exception발생으로 구분했다.
if(user?.userpw.equals(userpw)) {
val authorities = listOf(SimpleGrantedAuthority("ROLE_USER"))
return UsernamePasswordAuthenticationToken(userid,userpw,authorities)
}
UsernamePasswordAuthenticationToken :
(1) 인증 성공 시 반환되는 객체
(2) ROLE_USER이라는 권한을 부여한다.
else {
throw BadCredentialsException("비밀번호 오류 : BadCredentialsException")
}
비밀번호가 일치하지 않을 경우 BadCredentialsException 예외를 발생시킨다.
4)Support메서드
override fun supports(authentication: Class<*>): Boolean {
return UsernamePasswordAuthenticationToken::class.java.isAssignableFrom(authentication)
}
AuthenticationProvider 인터페이스에서 필수로 구현되야하는 메서드.
Spring Security가 인증을 처리할 때 현재의 인증요청 처리를 위해 사용한다.
UsernamePasswordAuthenticationToken 타입으로 처리하기위해 작성했다.
**ID/PW를 이용해 인증할때만 Provider이 작동한다는 의미이고 다른형태의 인증토큰은 작동하지 않는다**
Handler는 (3)편에 다루겠다.
반응형