1편과 달리 2편에서는 소스 위주로 작성 하도록 하겠습니다.
순서대로 하나하나 작성했어야 했는데... 작성하다보니 설정값들만 먼저 나열하고.. 뒤죽박죽 인듯 합니다 ㅠㅠ
1편 : 바로가기
git 전체 소스 : 바로가기
참고 :
* https://www.baeldung.com/spring-security-login
* https://www.thymeleaf.org/doc/articles/springsecurity.html
import com.hhseong.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Autowired
private LoginService loginService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String userId = (String)authentication.getPrincipal();
String userPassword = (String)authentication.getCredentials();
//로그인 로직 구현
UserDetails user = loginService.loadUserByUsername(userId);
return new UsernamePasswordAuthenticationToken(user.getUsername(), userPassword, user.getAuthorities());
}
@Override
public boolean supports(Class<?> authentication) {
return true;
}
}
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class LoginService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
//userId 를 이용하여 DB를 조회한다.
//성공일경우 user 객체 반환
List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
if ("user".equals(userId)) {
roles.add(new SimpleGrantedAuthority("ROLE_USER"));
} else if ("admin".equals(userId)) {
roles.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
} else {
return null;
}
return new User(userId, userId, roles);
}
}
* 앞서 작성된 action url 과 시큐리티 설정 url 이 같다면 컨트롤러까지 로그인 정보가 도달하지 못하며 중간에 시큐리티가 가
로채어서 AuthenticationProvider 인터페이스를 참조후 authenticate 구현체를 구현 해줘야한다.
* 로그인 정보는 Authentication authentication 이녀석이 담고 있으며, 주요 호출 함수는 다음과 같다
- isAccountNonExpired() 계정 만료 여부 (true = 만료되지 않음)
- isAccountNonLocked() 계정 잠금 여부 (true = 잠금되지 않음)
- isCredentialsNonExpired() 패스워드 만료 여부 (true = 만료되지 않음)
- isEnabled() 계정 사용 가능 여부 (true = 사용 가능)
- 담고 있는 정보는 아래와 같다.
아래 자료 출처 : 오디였징.. 죄송합니다 ㅠㅠ
git에 전체 소스 업로드 하였습니다 : 바로가기
'백앤드 이야기 > JAVA&Spring' 카테고리의 다른 글
[Spring] 스프링 배치, 스케쥴러 사용하기 (0) | 2020.09.28 |
---|---|
[JAVA] 클라이언트 실제 접속 IP 구하기 (0) | 2020.08.28 |
[Spring] Spring Boot + Gradle + Security 를 이용한 로그인/로그아웃 구현 - 1편 (2) | 2020.08.14 |
[JAVA] lotto.java (0) | 2020.08.11 |
[JAVA] 문자열 함수 기록 (0) | 2020.08.11 |
댓글