백앤드 이야기/JAVA&Spring

[Spring] Spring Boot + Gradle + Security 를 이용한 로그인/로그아웃 구현 - 1편

한희성 2020. 8. 14.
반응형

이번 포스팅은 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



반응형

댓글

💲 추천 글