반응형
1. 🤍스프링 시큐리티 프로젝트 생성
1. application.properties에 시큐리티 설정 추가
<html />
logging.level.org.springframework.security.web=trace logging.level.org.zerock=debug
2. 시큐리티 설정 클래스 SecurityConfig 작성
<java />
@Configuration @Log4j2 public class SecurityConfig extends WebSecurityConfigurerAdapter { }
2. 💡인증(Authentication) & 인가(Authorization)
- 은행에 금고가 있고 사용자가 금고 내용을 열어 본다고 가정했을 때
- 사용자가 신분증으로 자신을 증명 => 인증
- 은행에서 사용자가 금고를 열어볼 수 있는지 판단 => 인가 (일종의 허가)
3. 🤍스프링 시큐리티 커스터마이징
1. 스프링 부트 2.0부터는 인증을 위해 반드시 PasswordEncoder를 지정해야함.
- BCryptPasswordEncoder는 'bscrypt'라는 해시 함수를 이용해서 패스워드를 암호화함.
- 암호화된 패스워드는 다시 원래대로 복호화가 불가능하고 매번 암호화된 값도 다르게 됨.
- @Bean을 이용해서 BCryptPasswordEncoder를 지정할 수 있음.
<java />
@Bean PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); }
2. BcryptPasswordEncoder 테스트
- 내부적으로 "1111"이라는 문자열을 암호화함.
- 해당 문자열을 암호화한 결과가 "1111"에 맞는지 확인함(match)

- 테스트 결과

3. Security Config 클래스에 인가(Authorization)가 필요한 리소스 설정 코드 추가
- permitAll() : 모든 사용자에게 허락한다는 의미 -> 로그인하지 않아도 접근이 가능하게됨.
- formLogin() : 인가/인증 절차에서 문제가 발생했을 때 로그인 페이지를 보여주도록 지정함.
- logout() : 별도의 설정없이 로그아웃 처리 가능
<java />
@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();
4. 🤍프로젝트 JPA 처리
회원 정보는 아래와 같이 구성 예정
- 이메일(아이디 역할)
- 패스워드
- 이름(닉네임)
- 소셜 가입 여부
- 기타(등록일, 수정일)
1. 테이블 생성

2. 더미 데이터 넣기


5. 🤍시큐리티 UserDetailsService
- 스프링 시큐리티에서는 회원이나 계정에 대해 User라는 용어를 사용함.
- 회원 아이디 대신 username이라는 단어를 사용함.
- 사용자의 username, password로 인증 과정이 끝나면 원하는 URL에 접근할 수 있는 적절한 권한이 있는지 확인 후 인가 과정을 실행함.
1. ClubAuthMemberDTO 클래스 작성
- DTO 역할 + 스프링 시큐리티 인증, 인가 작업
- password는 부모 클래스를 사용하므로 별도 변수 선언 X

2. UserDetailsService 구현
- AuthenticationManager는 내부적으로 UserDetailsService를 호출하여 사용자 정보를 가져옴.
- JPA로 사용자 정보를 가져오고 싶다면 UserDetailsService가 이용하는 구조로 작성 필요
- 사용자가 존재하지 않으면 UsernameNotFoundException으로 처리
- ClubMember를 UserDetails 타입으로 처리하기 위해 ClubAuthMemberDTO 타입으로 반환

3. 사용자 정보를 화면으로 출력하기 위해 컨트롤러 코드 작성
<java />
@GetMapping("/member") public void exMember(@AuthenticationPrincipal ClubAuthMemberDTO clubAuthMember){ log.info("exMember............."); log.info("---------------------------"); log.info(clubAuthMember); }
4. member.html 작성
<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 |