Spring Security 로그인 처리를 해볼게요..
먼저. 시큐리티 설정 메서드에서
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/**")
.authenticated()
.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/loginForm")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/");
}
.defaultSuccessUrl()을 추가해 줄게요..
로그인 성공 시 이동시키기 위해서입니다..
시큐리티가 /login 주소 요청이 오면 낚아채서 로그인을 진행시킵니다.
로그인 진행이 완료가 되면 시큐리티 session을 만들어줍니다.
Authentication 타입의 객체가 들어가야 되는데,
Authentication 안에 User 정보가 있어야 됩니다.
User 오브젝트 타입은 Userdetails 타입의 객체입니다.
즉, Security Session -> Authentication -> UserDetails 가 됩니다.
UserDetails 타입의 PrincipalDetails
package com.cos.security1.config.auth;
import com.cos.security1.model.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList;
import java.util.Collection;
public class PrincipalDetails implements UserDetails {
private User user;
public PrincipalDetails(User user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
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;
}
}
생성자를 model의 User로 잡아줌으로써, 해당 user의 정보를 리턴하는 메서드를 오버라이딩합니다..
다음으로 UserDetailsService를 만들어줍니다..
package com.cos.security1.config.auth;
import com.cos.security1.model.User;
import com.cos.security1.repository.UserRepository;
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;
@Service
public class PrincipalDetailsService implements UserDetailsService {
private UserRepository userRepository;
public PrincipalDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userEntity = userRepository.findByUsername(username);
if (userEntity != null) {
return new PrincipalDetails(userEntity);
}
return null;
}
}
서비스로 지정해 줌으로써 스프링 컨테이너에 등록해 줍니다..
시큐리티 설정에서 /login을 지정해 줌으로써, 해당 요청이 오면
자동으로 UserDetailsService 타입으로 IoC 되어있는 loadUserByUsername 메서드가 실행됩니다..
loadUserByUsername 메서드에서 받아오는 String 타입의 username은 요청과 동시에 받아오는 파라미터를 의미합니다..
여기서, userRepository의 findByUsername도 구현을 해줍니다..
package com.cos.security1.repository;
import com.cos.security1.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Integer> {
public User findByUsername(String username);
}
아이디가 test1인 계정으로 로그인을 시도하면,
로그인과 동시에 인덱스 페이지로 이동하는 것을 확인할 수 있습니다..
여기서!!
http://localhost:8080/user
라는 요청을 통해 로그인 폼이 띄워지고, 로그인을 진행하게 된 후
인증이 완료되면 자동으로 http://localhost:8080/user로 리다이렉트 됩니다..
'Java > Springboot' 카테고리의 다른 글
MicroService 무중단배포 - 블루그린배포 (0) | 2025.03.10 |
---|---|
Spring Boot - Security 권한 처리 (0) | 2025.03.09 |
Spring Boot - Security 회원가입 (1) | 2025.03.08 |
Spring Boot - Security 필터 체인 등록 (0) | 2025.03.08 |
Spring Boot - AOP (0) | 2025.03.04 |