Spring-Security-3

akanana·2023년 2월 27일
0

Spring-Security

목록 보기
4/8

목표

  • 회원가입 및 로그인

회원가입

SecController.java

@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
...
@PostMapping("/join")
public String joinProc(User user) {
	user.setPassword(passwordEncoder.encode(user.getPassword()));
	user.setRole("ROLE_USER");
	userRepository.save(user);
	return "redirect:/login";
}

회원가입페이지에서 /join 으로 Post 요청을 보낼시, 위 메소드가 동작한다

이때, 비밀번호를 암호화 하기위해, SecurityConfig에서 Bean으로 등록했던 PasswordEncoder를 사용하였다.
권한은 ROLE_USER권한으로 지정하였다

UserDetails

PrincipalDetails.java

public class PrincipalDetails implements UserDetails{

    private User user;

    public PrincipalDetails(User user){
        this.user = user;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // User의 권한을 리턴
        Collection<GrantedAuthority> collect = new ArrayList<>();
        collect.add(new GrantedAuthority() {
            @Override
            public String getAuthority(){
                return user.getRole();
            }
        });
        return collect;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
    
}

UserDetailsService

PrincipalDetailsService.java

@Service
@Log4j2
public class PrincipalDetailsService implements UserDetailsService{
    @Autowired
    private UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String username) 
    		throws UsernameNotFoundException {
        log.info("loadUserByUsername");
        log.info(username);
        User user = userRepository.findByUsername(username);
        log.info(user);
        return new PrincipalDetails(user);
    }
}

login 요청시, loadUserByUsername(String username) 메소드가 실행된다

링크에서 위 두 개념에 대해 더 자세히 공부해보자

0개의 댓글