5. 시큐리티 로그인
by 볼빵빵오춘기SecurityConfig
- .loginProcessingUrl("/login") 붙이므로써 우리들의 /login을 안만들어도 된다.
- 로그인을 성공하면 .defaultSuccessUrl("/") 을 적어줌으로써 넘어가는 페이지를 지정 해준다.
@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") // login 주소가 호출이 되면 시큐리티가 낚아채서 대신 로그을 진행
.defaultSuccessUrl("/");
}
loginForm.html
action=”/login” 을 적어줌으로써 SecurityCofing.java에서 .loginProcessingUrl("/login") 부분이 낚아채서 로그인을 한다.
<form action="/login" method="POST">
<input type="text" name="username" placeholder="username"><br>
<input type="password" name="password" placeholder="password"><br>
<button>로그인</button>
</form>
PrincipalDetails
public class PrincipalDetails implements UserDetails {
private User user; // 컴포지션
public PrincipalDetails(User user){
this.user = user;
}
// 해당 User의 권한을 리턴하는 곳!
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// user.getRole();
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() {
// 우리 사이트!! 1년동안 회원이 로그인을 안하면 !! 휴먼 계정으로 하기로 함.
// user.getLoginDate(); => 들구와서 현재시간 - 로그인시간 => 1년을 초과하면 return false;
return true;
}
}
PricipailDetailsService
- UserDetailsService implements 해준다.
- loadUserByUsername 를 override 한다.
- 메모리에 Service라고 띄우기 위해 @Service를 붙여준다.
- 그럼 왜 PricipalDetails는 메모리에 강제로 띄우지 않는가?
(나중에 작성자가 강제로 new 해서 메모리에 띄울 예정이기 때문에 따로 어노테이션을 붙이지 않음.)
// 시큐리티 설정에서 loginProcessingUrl("/login");
// login 요청이 오면 자동으로 UserDetailsService 타입으로 IoC되엉 있는 loadUserByUsername 함수가 실행
// => 규칙이다.
@Service
public class PrincipalDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
// 시큐리티 session = Authentication = UserDetails
// 시큐리티 session = Authentication(내부 UserDetails)
// 시큐리티 session(내부 Authentication(내부 UserDetails))
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userEntity = userRepository.findByUsername(username);
return null;
}
}
UserRepository
public interface UserRepository extends JpaRepository<User, Integer> {
// findBy 규칙 -> Username 문법
// select * form user where username = ?
public User findByUsername(String username);
}
PricipailDetailsService
return new PrincipalDetails(userEntity) 을 리턴을하게되면 user정보를 담고 UserDetails로 최종 return을 하게된다.
@Service
public class PrincipalDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
// 시큐리티 session = Authentication = UserDetails
// 시큐리티 session = Authentication(내부 UserDetails)
// 시큐리티 session(내부 Authentication(내부 UserDetails))
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userEntity = userRepository.findByUsername(username);
if(userEntity!=null){
return new PrincipalDetails(userEntity);
}
return null;
}
}
더보기
실행결과
회원가입 후 로그인을 하면 인덱스 페이지로 넘어가게 된다.
회원가입을 하면 ROLE은 ROLE_USER가 되게끔 했었다.
따라서 로그인 후 /user 요청을 하면 페이지가 아래와 같이 제대로 페이지가 넘어간게 보이지만
/admin, /manager 요청을 하면 페이지가 아래와 같이 403 이 뜬다. (403 = 권한이 없다는 의미)
'강의 따라하기 > Security1' 카테고리의 다른 글
7. 구글 로그인 준비 (1) | 2024.02.27 |
---|---|
6. 시큐리티 권한처리 (0) | 2024.02.27 |
4. 시큐리티 회원가입 (0) | 2024.01.14 |
3. 시큐리티 설정 (1) | 2024.01.14 |
1. 환경설정 (1) | 2024.01.14 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기