반응형
🤍스프링 시큐리티 프로젝트 생성
1. application.properties에 시큐리티 설정 추가
logging.level.org.springframework.security.web=trace
logging.level.org.zerock=debug
2. 시큐리티 설정 클래스 SecurityConfig 작성
@Configuration
@Log4j2
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
💡인증(Authentication) & 인가(Authorization)
- 은행에 금고가 있고 사용자가 금고 내용을 열어 본다고 가정했을 때
- 사용자가 신분증으로 자신을 증명 => 인증
- 은행에서 사용자가 금고를 열어볼 수 있는지 판단 => 인가 (일종의 허가)
🤍스프링 시큐리티 커스터마이징
1. 스프링 부트 2.0부터는 인증을 위해 반드시 PasswordEncoder를 지정해야함.
- BCryptPasswordEncoder는 'bscrypt'라는 해시 함수를 이용해서 패스워드를 암호화함.
- 암호화된 패스워드는 다시 원래대로 복호화가 불가능하고 매번 암호화된 값도 다르게 됨.
- @Bean을 이용해서 BCryptPasswordEncoder를 지정할 수 있음.
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
2. BcryptPasswordEncoder 테스트
- 내부적으로 "1111"이라는 문자열을 암호화함.
- 해당 문자열을 암호화한 결과가 "1111"에 맞는지 확인함(match)
- 테스트 결과
3. Security Config 클래스에 인가(Authorization)가 필요한 리소스 설정 코드 추가
- permitAll() : 모든 사용자에게 허락한다는 의미 -> 로그인하지 않아도 접근이 가능하게됨.
- formLogin() : 인가/인증 절차에서 문제가 발생했을 때 로그인 페이지를 보여주도록 지정함.
- logout() : 별도의 설정없이 로그아웃 처리 가능
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/sample/all").permitAll()
.antMatchers("/sample/member").hasRole("USER");
http.formLogin(); //인가&인증에 문제 시 로그인 화면
http.csrf().disable(); //csrf 토큰 비활성화
http.logout();
🤍프로젝트 JPA 처리
회원 정보는 아래와 같이 구성 예정
- 이메일(아이디 역할)
- 패스워드
- 이름(닉네임)
- 소셜 가입 여부
- 기타(등록일, 수정일)
1. 테이블 생성
2. 더미 데이터 넣기
🤍시큐리티 UserDetailsService
- 스프링 시큐리티에서는 회원이나 계정에 대해 User라는 용어를 사용함.
- 회원 아이디 대신 username이라는 단어를 사용함.
- 사용자의 username, password로 인증 과정이 끝나면 원하는 URL에 접근할 수 있는 적절한 권한이 있는지 확인 후 인가 과정을 실행함.
1. ClubAuthMemberDTO 클래스 작성
- DTO 역할 + 스프링 시큐리티 인증, 인가 작업
- password는 부모 클래스를 사용하므로 별도 변수 선언 X
2. UserDetailsService 구현
- AuthenticationManager는 내부적으로 UserDetailsService를 호출하여 사용자 정보를 가져옴.
- JPA로 사용자 정보를 가져오고 싶다면 UserDetailsService가 이용하는 구조로 작성 필요
- 사용자가 존재하지 않으면 UsernameNotFoundException으로 처리
- ClubMember를 UserDetails 타입으로 처리하기 위해 ClubAuthMemberDTO 타입으로 반환
3. 사용자 정보를 화면으로 출력하기 위해 컨트롤러 코드 작성
@GetMapping("/member")
public void exMember(@AuthenticationPrincipal ClubAuthMemberDTO clubAuthMember){
log.info("exMember.............");
log.info("---------------------------");
log.info(clubAuthMember);
}
4. member.html 작성
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>For Member</h1>
<div sec:authorize="hasRole('USER')">Has USER ROLE</div>
<div sec:authorize="hasRole('MANAGER')">Has MANAGER ROLE</div>
<div sec:authorize="hasRole('ADMIN')">Has ADMIN ROLE</div>
<div sec:authorize="isAuthenticated()">
Only Authenticated user can see this Text
</div>
Authenticated username :
<div sec:authentication="name"></div>
Authenticated user roles :
<div sec:authentication="principal.authorities">
</div>
</body>
</html>
5. 로그인 성공 시 회원 정보가 나오고
6. 실패 시 아래와 같이 나옴.
반응형
'💻 my code archive > 🏷️JAVA & Spring(Boot)' 카테고리의 다른 글
스프링부트 공부기록(32) - API 서비스 만들기 (0) | 2022.03.21 |
---|---|
스프링부트 공부기록(31) - 스프링 시큐리티 구글 로그인 구현하기 (0) | 2022.03.21 |
스프링부트 공부기록(29) - 영화 리뷰 프로젝트 :: 영화 목록 처리, 리뷰 등록, 영화 상세 정보 조회 구현하기 (0) | 2022.03.20 |
스프링부트 공부기록(28) - 영화 리뷰 프로젝트 :: 영화 등록 구현하기 (0) | 2022.03.20 |
스프링부트 공부기록(27) - 영화 리뷰 프로젝트 :: 파일 업로드 처리, 영화 포스터 업로드 구현하기 (0) | 2022.03.20 |