본문 바로가기

KNOWHOW/back

spring boot security custom login






A. spring security 커스텀 설정을 위해서는 WebSecurityConfigurerAdapter를 상속 받은 Configuration을 구현해야 한다.

configure 메소드들을 override해서 custom 환경을 셋팅한다.

1. configure(WebSecurity web) : 

web.ignoring().antMatchers("/resources/**");

// 내 경우 webapp/resources 에 css, js, image 파일들을 모아놓았고 jsp 파일은 webapp/WEB-INF/view/에 모아놓았다.


2. configure(HttpSecurity http) : 

...

.antMatchers(...).permitAll()                    // matcher된 경로들은 모두 허용

.anyRequest().denyAll()                          // 그 외에는 모두 허용 안함

.formLogin()                                     // 로그인 커스텀

.loginPage("/user/loginForm")                // 로그인 폼

.loginProcessingUrl("/user/executeLogin")    // 로그인 수행

.defaultSuccessUrl("/main/index")            // 로그인 성공시 url

.usernameParameter("email")                  // 폼 데이터중 로그인 아이디로 사용할 이름

.passwordParameter("password")               // 폼 데이터중 로그인 패스워드로 사용할 이름

.permitAll()

.and()

.logout()    // 로그아웃 커스텀

.logoutSuccessUrl("/main/index")

.permitAll()

...


3. configureGlobal(AuthenticationManagerBuilder auth)

auth.userDetailsService(userService).passwordEncoder(passwordEncoder());

// 아래에서 UserDetailsService를 상속받아 구현한 UserService와 passwordEncoder를 넘긴다.


4. PasswordEncoder bean 등록

public PasswordEncoder passwordEncoder() {

return PasswordEncoderFactories.createDelegatingPasswordEncoder();

}



B. 디비에서 데이터를 가져오기 위해서는 UserDetailsService를 상속 받아 UserService를 구현하면 되는데 

구현해야 하는 메소드는  loadUserByUsername, 수정해야 하는 부분은 회원 가입에 비밀번호 암호화

1. loadUserByUsername(String email)    // 나는 로그인 아이디로 이메일을 사용하기 때문에 파라미터 명을 바꿔줌

User user = userRepository.findByEmail(email);    // 이메일로 사용자정보를 조회하는 부분

List<GrantedAuthority> authorities = new ArrayList<>();    // 권한 셋팅

authorities.add(new SimpleGrantedAuthority(user.getUserGroup()));

return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), authorities);

// 내가 사용하는 도메인과 이름이 겹쳐서 전체패키지 명시


2. 회원 등록시 비밀번호는 A에서 등록된 PasswordEncoder 빈을 주입받아 암호화해서 저장해야 한다.


C. 나같은 경우 loginForm과 executeLogin으로 구성되어 있는데  

loginForm은 컨트롤러에서 해당 폼 jsp를 리턴하고 executeLogin에서 security가 로그인 처리를 한다.

1. loginForm 컨트롤러는 loginForm을 리턴

<form method="POST" action="/user/executeLogin">    // 로그인 form

// 폼 내의 아이디 비밀번호 받는 input의 name이 A-2에서 설정한 파라미터 이름과 동일해야 한다.


2. executeLogin 컨트롤러는 딱히 하는 일은 당장 없음. 세션에 값을 저장한다던지 하는 작업을 처리하면 될꺼 같음

좀더 생각해봐야 하는 문제는 그냥은 executeLogin 컨트롤러를 타지 않음. A에서 defaultSuccessUrl에 executeLogin 으로 값을 주면 컨트롤러를 탐.


컨트롤러 타기 전에 필터에서 셋팅된 일련의 과정을 거친 후 튕기던지 받아들이던지 하는 것 같음.