스프링 시큐리티 로그인 기능 만들기
1. 스프링 시큐리티 설정
2. 로그인 정보 조회 쿼리 & 실행 메소드 만들기
로그인 데이터를 조회하는 쿼리와
쿼리를 실행시키는 메소드를 만들어줍니다.
<select id="selectLoginInfo" resultMap="member">
SELECT MEMBER_ID
, MEMBER_PW
, MEMBER_ROLL
FROM SHOP_MEMBER
WHERE MEMBER_ID = #{memberId}
</select>
3. 시큐리티 로그인 기능 클래스 만들기
UserDetailsService 인터페이스를 구현하는 클래스를 만들고
해당 인터페이스의 메소드(loadUserByUsername)를 오버라이드 해줍니다.
아까 만든 로그인 정보 조회 메소드 login()을 사용하여
UserDetails 객체에 로그인 정보를 넣고 리턴해줍니다.
UserDetails user = User.withUsername(아이디)
.password(비밀번호)
.roles(권한)
.build();
@Service
@RequiredArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {
private MemberService memberService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
MemberVO memberVO = memberService.selectLoginInfo(username);
return User.withUsername(memberVO.getMemberId())
.password(memberVO.getMemberPw())
.roles(memberVO.getMemberRoll()).build();
}
}
4. SecurityConfig 설정
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.csrf(AbstractHttpConfigurer::disable) //csrf공격에 대한 보안 해제
.authorizeHttpRequests(authorize ->
//authorize.anyRequest().permitAll() //모든 요청 허용
authorize.requestMatchers("/"
, "/item/main"
, "/member/joinForm"
, "/member/join"
, "/member/loginForm"
, "/member/login").permitAll() //해당 경로는 허가됨
.requestMatchers("/admin/**").hasRole("ADMIN") // 권한이 "ADMIN"만 허가됨 (2개부턴 hasAnyRole)
.anyRequest().authenticated() //나머지는 인증 필요
)
.formLogin(login ->
login.loginPage("/member/loginForm") //로그인 하는 페이지
.loginProcessingUrl("/login") //로그인 처리 UserDetailsService구현메소드 실행
.usernameParameter("memberId") //아이디 입력 input name값
.passwordParameter("memberPw") //비밀번호 입력 input name값
.defaultSuccessUrl("/item/main", true) //로그인 성공 시 이동 경로(true는 경로로, false는 이전페이지로 이동)
.failureUrl("/loginForm") //로그인 실패 시 이동 경로
).logout(logout ->
logout.logoutUrl("/member/logout") //로그아웃
.invalidateHttpSession(true) //로그아웃 시 세션 초기화 true false
.logoutSuccessUrl("/item/main") //로그아웃하고 이동경로
);
return http.build();
}
권한 없는 사람이 들어올때 이동 페이지
.exceptionHandling(excep ->
excep.accessDeniedPage("/member/denyPage") //접근 거부됐을 때 가는 페이지 컨트롤러 경로
);