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 = 권한이 없다는 의미)


블로그의 정보
Hello 춘기's world
볼빵빵오춘기