Hello

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

볼빵빵오춘기

활동하기