티스토리 뷰
안녕하세요 강정호입니다.
패스트 캠퍼스 스프링 부트 강의 4번째 수업에 대한 강의 내용을 적어보겠습니다.
오늘 학습 주제
Spring Security를 이용.
- 회원정보 (id, password)
- Role에 대한 정보. - 어떤 회원이 관리자 권한, 일반 권한을 가지는 것
회원 ---------> Role
관계? 1명의 회원은 여러 Role을 가질 수 있다
1개의 Role은 여러 회원을 가질 수 있다.
--> 즉 다대다 관계이다.
다대다 관계에서는 Join table을 사용한다.
회원가입
로그인
로그아웃
@ManyToMany
@JoinTable : 다대다 관계에서 조인 관계를 맺을 때 복합키를 가지는 테이블이 필요하다.
ex) @JoinTable(name="member_member_role")
Board가 카테고리 관계 - 다 쪽에 포린키가 붙는다.
즉 카테고리에서는 mappedBy를 사용하여
1교시 : Member, Role 엔티티 생성, 테이블 조인, Repository 쿼리 메서드 생성
2교시 : Test 코드 작성. Assert. 스프링 시큐리티
3교시 : 암호화!, UserDetailsService 만들기, 설정.
Member, Role 엔티티 생성
일단 Member와 Role 간의 관계에 대해서 알아야 한다.
테이블 측면
Member, Member_role 테이블은 다대다 관계이다.
그래서 중간에 두 테이블의 키를 가지는 복합키 테이블이 필요하다.
Member_member_role 이라는 복합키 테이블이 다대다 관계 사이에 맺어진다.
Member_member_role 테이블은 member_id, role_id 2개의 FK를 PK로 가진다.
엔티티 측면
테이블과 다르게 엔티티에서는 다대다 관계를 맺을 수 있다.
대신 방향을 정해줘야 한다. 단방향, 양방향을 정해야 한다.
myshop 프로젝트에서는
Member 엔티티가 Role을 가지고 있고, Role은 Member에 대한 정보를 가지고 있지 않다.
//@ManyToMany(cascade = {CascadeType.ALL}) //우리가 사용하는 Role정보는 이미 DB에 저장되어 있다.
@ManyToMany
@JoinTable(name="member_member_role",
joinColumns = @JoinColumn(name="member_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name="member_role_id", referencedColumnName = "id"))
Set<Role> roles; // Member는 여러개의 Role을 가질 수 있기 때문이다.
위와 같이 다대다 관계를 맺고, Set<Role> roles를 가지고 있어서 Member는 Role에 대한 정보를 가진다.
@ManyToMany : Member와 Role이 다대다 관계를 맺고 있기 때문에 @ManyToMany 어노테이션을 붙여주어야 한다. CascadeType.ALL을 주석처리한 이유는 CascadeType.ALL은 Member가 저장될 때 Role도 같이 저장될 수 있게 하는 것인데, Role은 Member가 생성되기 전에 이미 저장되어 있기 때문에 cascade 옵션이 필요 없다.
@JoinTable
no session 오류 --> 트랜잭셔널 어노테이션 붙이기
@SpringBootTest, @DataJpaTest 어노테이션의 사용성에 대해 공부하기
스프링 시큐리티 2교시
pom.xml에 Spring security 디펜던시를 추가한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
어플리케이션을 실행하면
Using generated security password: 12a8588b-c6eb-4d23-b226-000b78d0016b
와 같은 못 보던 것이 뜬다.
spring-boot-starter-security를 사용하면 모든 화면에 로그인을 해야 사용할 수 있다.
필터
권한이 없으면 접근을 하지 못한다.
얜 아직 로그인이 안됬네, 필터가 바로 로그인 페이지로 리다이렉트 시킨다.
UserDetails가 가지는 값
- 암호 : 암호화된 암호
- Username
- 권한들
로그
모든 URL이 현재 모두 로그인 해야 사용할 수 있다. 하지만 path에 따라서 어떤 권한을 가진 사람만 접근할 수 있도록 하는 것을 한다.
3교시
InMemoryUserDetailsManager
우리만의 스타터를 만들자.
{bcypt} : 이것이 암호화 알고리즘 이름이다. 비밀번호 암호화를 하게되면 이것이 앞에 붙는다.
PasswordEncoder를 이용하여 암호화 하여야 한다.
GrantedAuthority API 검색
4교시 WebApplicationSecurity
configure라는 메서드
web.ignoring() 인증을 무시한다
--> 로그인이랑은 상관 없는 것.
Ant에서 path 문법을 봐야한다.
정규표현식과 관련된
HttpSecurity http :
path 별 접근 설정, 위에서 부터 체크 순서가 중요.
hasRole : 유저 권한 필요
permitAll : 모두 접근 가능
successHandler : 성공했을 때 처리해주는 핸들러
Security Context Holder --> 내부적으로 ThreadLocal을 가진다.
ThreadLocal에 값을 담아 놓으면 같은 스레드 내부라면 언제든지 값을 가져서 쓸 수 있다.
웹은 요청을 받아서 응답할 때까지 사이클이 1개의 쓰레드이다.
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
SecurityContextHolder.getContext()는 스레들 정보를 가져오는 것이다.
'Back-end' 카테고리의 다른 글
[Spring Boot] 패캠 5번쨰 수업 (0) | 2018.11.03 |
---|---|
N:M 관계(다대다 관계) (0) | 2018.10.28 |
영속성 컨텍스트(Persistence Context) (0) | 2018.10.26 |
[Spring Boot] 엔티티 맵핑과 테스트 코드 작성 (0) | 2018.10.21 |
[Spring Boot] JPA (0) | 2018.10.20 |
- Total
- Today
- Yesterday
- 열반스쿨기초반
- 관계대수
- 깃허브
- 인셉션
- ```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
- 내년은 빡세게!!
- Inception
- Use case
- resize
- 항해플러스백엔드
- 부동산공부
- front
- 2023년
- GIT
- 재테크공부
- 깃
- 개발자 회고
- pop_back
- 도커
- 폭포수
- Spring boot
- 월부닷컴
- push_back
- 유즈케이스
- 항해솔직후기
- github
- 월급쟁이부자들
- 파라메터
- docker
- 항해플러스후기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |