[SpringBoot] Spring Security 설정 (url 제한 및 로그인 페이지 설정 )
Spring Security(스프링 시큐리티)
스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증과 권한,인가 등)을 담당하는 스프링 하위 프레임워크이다. 주로 서블릿 필터와 이들로 구성된 필터체인으로의 위임모델을 사용한다. 그리고 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다.
security 관련 설정 잡기
maven의 경우 아래와 같이 디펜던시 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
위의 디펜던시를 추가하고 아무설정도 하지 않는 경우 기본적으로 브라우저에서는 아래와 같은 시큐리티 로그인 화면을 노출시킨다.
따라서 직접 설정한 로그인 페이지를 노출시키기 위해선 로그인 페이지는 시큐리티 설정을 제외시키는 설정을 해줘야한다.
1. 클래스를 생성하여 websecurityconfigureradapter 를 상속 받는다.
2. @configuration 해당 클래스에서 Bean을 등록하고자 함을 명시해주어야 한다.
3. WebSecurityConfigurerAdapter를 상속받은 config 클래스에 @EnableWebSecurity 어노테이션을 달면SpringSecurityFilterChain이 자동으로 포함된다.
4. configure 메서드 오버라이드 하기(http 관련)
5. http.authorizeRequests() 보호된 리소스 URI에 접근할 수 있는 권한을 설정
6. http.csrf().disable() csrf 보안 설정을 비활성화 => 이후 자바스크립트로 rest api 요청할시에 필요
7. formLogin().loginPage("pagePath").defaultSuccessUrl("성공후 이동할 페이지") 시큐리티 로그인 페이지 대신 사용할 로그인 페이지 요청 url 설정
8. anyRequest().permitAll() 전체 허용 설정
package com.cos.photogramstart.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder encode(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// csrf 비활성화
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/","/user/**","./image/**","/subscribe/**","/comment/**")
.authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/auth/signin") //get (로그인 요청이 필요하면)
.loginProcessingUrl("/auth/signin") // post (로그인을 요청하면)
.defaultSuccessUrl("/");
}
}
로그인처리
시큐리티에서는 기본적으로 로그인 처리를 담당해준다.
위에 부분을 시큐리티 설정을 해두면 해당 url로 요청이 들어올시에 ioc에 등록된 UserDetailsService가 가로채서 처리한다.
이 부분을 PrincipalDetailsService를 만들어 구현하여 로그인에 필요한 정보를 확인한다.
package com.cos.photogramstart.config.auth;
import com.cos.photogramstart.domain.user.User;
import com.cos.photogramstart.domain.user.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;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class PrincipalDetailsService implements UserDetailsService {
private final UserRepository userRepository;
/**
* 1. 리턴시에 자동으로 세션 생성
* 2. PrincipalDetails(userdetails) 타입으로 리턴
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userEntity= userRepository.findByUsername(username);
if(userEntity==null){
return null;
}else{
return new PrincipalDetails(userEntity);
}
}
}
로그인에 필요한 권한들을 확인한다. 안쓰는 설정은 모두 true바꿔야 로그인이 완료가 된다.
package com.cos.photogramstart.config.auth;
import java.util.ArrayList;
import java.util.Collection;
import com.cos.photogramstart.domain.user.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import lombok.Data;
@Data
public class PrincipalDetails implements UserDetails{
private static final long serialVersionUID=1L;
private User user;
public PrincipalDetails(User user){
this.user= user;
}
/**
* 권한 확인
* 권한이 한개가 아닐수 있기때문에 collection 타입으로 되어있다
*/
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new ArrayList<>();
collection.add(new GrantedAuthority() {
@Override
public String getAuthority(){
return user.getRole();
}
});
return collection;
}
@Override
public String getPassword() {
// TODO Auto-generated method stub
return user.getPassword();
}
@Override
public String getUsername() {
// TODO Auto-generated method stub
return user.getUsername();
}
/**
* 계정 만료 여부
*/
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
}
/**
* 계정 잠금 여부
*/
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
}
/**
* 계정 비번 만료 여부
* 비번 변경 주기 여부 확인
*/
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
}
/**
* 계정 활성화 여부
*/
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
}
'Framework > SpringBoot' 카테고리의 다른 글
[SpringBoot] 회원가입 기능시 필요한 @Valid / @ControllerAdvice (예외처리, 유효성 검사 설정) (0) | 2022.02.21 |
---|
댓글