티스토리 뷰

안녕하세요 강정호입니다.

패스트 캠퍼스 스프링 부트 강의 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()는 스레들 정보를 가져오는 것이다.


댓글