- 이번 시간에는 로그인 기능을 구현해보려고 합니다. 우선 회원가입의 경우에는 우리가 직접 컨트롤러를 작성하여 구현해주었는데, 로그인의 경우 Spring Security가 자동으로 수행하도록 할 것입니다.
📝 SecurityConfig
- 먼저 Security 설정 클래스에
.loginProcessingUrl()
메소드를 추가해주었습니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable() //csrf 토큰 비활성화
.authorizeRequests()
.antMatchers("/", "/user/**", "image/**", "/subscribe/**", "/comment/**").authenticated() //해당 경로로 접근하기 위해서는 권한이 필요함
.anyRequest().permitAll() //이외의 경로에 대해서는 모두 허용
.and()
.formLogin()
.loginPage("/auth/signin") //로그인 페이지 경로(GET)
.loginProcessingUrl("/auth/signin") //로그인 요청 경로(POST) - 해당 경로로 요청이 올 경우 Spring Security가 로그인 진행
.defaultSuccessUrl("/"); //로그인에 성공할 시 요청되는 경로
}
- 해당 메서드는 지정된 경로로 요청이 올 경우 Spring Security가 로그인을 수행하도록 해줍니다.
📝 PrincipalDetailsService
- 다음으로
UserDetailsService
를 구현하는 클래스를 생성하여 아래와 같이 구현해줍니다.
package com.cos.photogram.config.auth;
...
@RequiredArgsConstructor
@Service
public class PrincipalDetailsService implements UserDetailsService {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userEntity = userRepository.findByUsername(username);
return new PrincipalDetails(userEntity);
}
}
UserDetailsService
의loadUserByUsername
메서드는 http body에서username
과password
를 받아와 로그인을 수행하는 역할을 하며password
의 경우 내부에서 자동으로 처리해주기 때문에 우리는username
만 검사해주면 됩니다.- 이를 위해
UserRepository
를 이용해야 하는데, 기본적으로JpaRepository
에는findByUsername
이라는 함수는 존재하지 않습니다. 따라서 우리는 이를 직접 만들어주어야 합니다. - 또한 함수의 반환 타입이
UserDetails
타입이므로, 이 또한 직접 구현해주어야 합니다.
📝 UserRepository
package com.cos.photogram.domain.user;
...
public interface UserRepository extends JpaRepository<User, Long>{
User findByUsername(String username);
}
📝 PrincipalDetails
package com.cos.photogram.config.auth;
...
@Data
public class PrincipalDetails implements UserDetails {
private static final long serialVersionUID = 1L;
private User user;
public PrincipalDetails(User user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collector = new ArrayList<>();
collector.add(() -> user.getRole());
return collector;
}
@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;
}
}
'🚗 Backend Toy Project > Photogram' 카테고리의 다른 글
[Photogram] 구독하기 (0) | 2022.07.10 |
---|---|
[Photogram] 회원정보 수정 (0) | 2022.07.09 |
[Photogram] 회원가입 - 공통 응답 DTO, Script 만들기 (0) | 2022.07.08 |
[Photogram] 회원가입 - Validation (0) | 2022.07.07 |
[Photogram] 회원가입 - 데이터베이스 저장 (0) | 2022.07.07 |