이번 포스팅은 Spring Boot + Gradle + Security 를 이용한 로그인/로그아웃 구현 하도록 하겠습니다!
* 개발환경
- 인텔리J 2020. 1
- JAVA8
- Spring Boot 2.3.2
- Gradle-6.4.1
* 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-test'
// https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity5
compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity5', version: '3.0.4.RELEASE'
- 타임리프 관련 의존성을 추가해주지 않으면 시큐리티 태그 sec 를 사용할 수 없다.
* WebSecurityConfigurerAdapter 상속
- configure(WebSecurity web) 구현
- configure(HttpSecurity http) 구현
* 이 메서드를 @Override 하지 않으면 스프링에서 기본으로 제공하는 로그인 화면이 나옵니다.
import com.hhseong.service.LoginService;
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.builders.WebSecurity;
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;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/js/**","/css/**","/images/**","/font/**","/html/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/**").permitAll()
.and()
.formLogin()
.loginPage("/login/form")
.usernameParameter("userId")
.passwordParameter("password")
.loginProcessingUrl("/login/perform")
.defaultSuccessUrl("/login/success")
.failureUrl("/login/fail")
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login/logout")
.invalidateHttpSession(true)
.and()
.exceptionHandling().accessDeniedPage("/login/denied");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public LoginService loginService() {
return new LoginService();
}
}
- WebSecurity filter 구현
* 해당 경로에는 security 가 모두 무시할 수 있도록 설정
* 기본 경로는 resources/static
- HttpSecurity 구현
* http request 에 대한 보안 설정
* authorizeRequests() : request 에따라 접근 제어
표현식 |
설명 |
antMatchers("/admin/**").hasRole("ADMIN") |
/admin 경로의 모든 경로는 ADMIN 권한 사용자만 접근 |
antMatchers("/**").permitAll() |
모든 경로에 권한없이 접근 가능 |
.anyRequest().authenticated() |
모든 요청에 인증된 |
* formlogin() form 로그인 기반으로 인증설정
표현식 |
설명 |
loginPage("/login/form") | 로그인 페이지 |
usernameParameter("userId") |
커스텀 파라메터 default : username |
passwordParameter("password") |
커스텀 파라메터 default : password |
loginProcessingUrl("/login/perform") |
action 에 동일한 url 적용 시 AuthenticationManager 상속 구현 |
defaultSuccessUrl("/index") |
로그인 성공 |
failureUrl("/login/fail") |
로그인 실패 |
successHandler() |
로그인 성공 이후 호출 되는 함수 |
failureHandler() |
로그인 실패 이후 호출 되는 함수 |
추가 *
session-management
- invalid-session-url : invalid session(세션 타임아웃 등) 이동 url
- max-sessions : 최대 허용 세션
- expired-url : 중복 로그인 시 이동 URL (최초 접속 세션이 사라지고 다음 요청시 invalid-session-url로 이동)
- error-if-maximum-exceeded : max-sessions을 넘었을때 접속한 세션을 실패처리할지 여부
- (expired-url중 1개만 사용)
참고 :
* https://www.baeldung.com/spring-security-login
* https://www.thymeleaf.org/doc/articles/springsecurity.html
'백앤드 이야기 > JAVA&Spring' 카테고리의 다른 글
[JAVA] 클라이언트 실제 접속 IP 구하기 (0) | 2020.08.28 |
---|---|
[Spring] Spring Boot + Gradle + Security 를 이용한 로그인/로그아웃 구현 - 2편 (0) | 2020.08.17 |
[JAVA] lotto.java (0) | 2020.08.11 |
[JAVA] 문자열 함수 기록 (0) | 2020.08.11 |
gradle + Spring boot jar 생성 (0) | 2020.07.21 |
댓글