백앤드 이야기/JAVA&Spring

[Spring] Spring Boot + Gradle + Security 를 이용한 로그인/로그아웃 구현 - 2편

한희성 2020. 8. 17.
반응형

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에 전체 소스 업로드 하였습니다 : 바로가기

반응형

댓글

💲 추천 글