티스토리 뷰
회원가입 Configuration
http.authorizeRequests()
//.antMatchers("/user/**").authenticated() //인증만 되면 들어갈 수 있는 주소
.antMatchers("/").permitAll()
.antMatchers("/join").permitAll()
.antMatchers("/joinForm").permitAll()
.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().authenticated()
스프링 시큐리티에서는 사이트를 이용할 수 없도록 .anyRequest().authenicated()로 차단할 수 있다.
하지만 그전에 인덱스 페이지나 회원가입, 로그인 등 등 몇몇 페이지는 사용자에게 오픈을 해둬야 사이트를 이용할 수 있을 것이다.
이와 같은 설정은 .permitAll() 을 활용한다.
- 물론 대부분이 인증/인가 없이 사용할 수 있는 사이트라면 특정 URL만 인가가 필요하도록 설정할 수도 있을 것이다.
이제 클라이언트가 /joinForm 페이지에서 데이터를 작성하고 /join 페이지로 회원가입 요청을 보낸다면, 컨트롤러에서 User를 생성하는 로직을 태운다.
완료 후 /loginForm 으로 리다이렉트 시키면 /loginForm 페이지로 이동할 것이다.
로그인 Configuration
.and()
.formLogin() //로그인 페이지에 대해 설정함
.loginPage("/loginForm") //비인증된 경우 로그인 페이지로 이동함
//.usernameParameter("username2") //클라이언트에서 username으로 값을 보내지 않을 때 사용
.loginProcessingUrl("/login") //login 주소가 호출되면 시큐리티가 낚아채서 대신 로그인을 진행한다. - Controller에서 /login 페이지로 이동 안시켜도 됨
.defaultSuccessUrl("/") //성공 시 도달 페이지. + 근데, 특정 페이지로 갔을 때 로그인 요청이 생기면, 로그인 성공 후 이전페이지로 보내줌!!!
.permitAll()
클라이언트에서 인가가 필요한 페이지에 접근했을 때, 스프링 시큐리티는 로그인 페이지로 이동시킨다.
이때 어떤 페이지로 갈지 개발자가 지정해줄 수 있다. loginPage("/loginForm")이라고 등록하면, 로그인 데이터를 받아올 주소가 /loginForm이라는 것을 알게 된다.
- 스프링 시큐리티에서 기본으로 제공하는 로그인 폼이 있다. 별다른 설정이 없을 경우 기본 폼으로 이동한다.
loginForm에서는 아이디와 패스워드를 입력할 form을 만들어주고, 로그인 처리를 수행할 주소를 작성한다.
로그인 처리는 스프링 시큐리티에서 대신 해주는데, 클라이언트에서 어떤 주소를 호출했을 때 로그인 처리를 시켜주는지 정의해줄 수 있다.
loginProcessingUrl("/login")이라고 작성해줌으로써, 클라이언트에서 /login 으로 요청을 보냈을 때, 스프링 시큐리티가 낚아채서 로그인을 대신 처리하게끔 할 수 있다
- Controller에서 /login 에 대해 매핑을 해주지 않아도 되고, 로그인 처리에 대해 별도로 구현하지 않아도 된다.
loginProcessingUrl()이 호출되면 스프링 시큐리티는 세션을 생성한다.
먼저 UserDetailsService 타입의 loadUserByUsername()이 자동으로 호출되어 UserDetails를 반환하고, 이 UserDetails는 Authentication에 들어가 세션이 만들어진다.
- loadUserByUsername() 안에 DB에 해당 username을 가진 데이터가 있는지 검사를 하는 로직이 들어가야할 것이다.
- form에서 id 필드는 반드시 name=username이어야 loadUserByUsername()의 매개변수에 올바른 데이터가 들어간다.
그런데, 세션에는 Authentication 타입이 들어가야 하고, Authentication에는 UserDetails/OAuth2User 타입만 들어갈 수 있다.
때문에 클래스 생성 시 UserDetails를 implements한 클래스와 UserDetailsService를 implements한 클래스를 활용하여야 한다.
로그인 성공 후 특정 페이지로 이동시키고 싶다면 defaultSuccessUrl("/")로 지정할 수 있다. 이 경우 루트로 이동한다.
만약 /manager 링크로 들어갔다가 비인증 상태여서 로그인 페이지로 이동이 된 상황이라면, 로그인 성공 시 자동으로 /manager 링크로 이동된다.
- 로그인 실패 시에는 loginURL?error 주소로 이동되는데, 이에 대한 처리를 하고 싶다면 failureHandler()를 활용할 수 있다.
configure 메서드 전체
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
//.antMatchers("/user/**").authenticated() //인증만 되면 들어갈 수 있는 주소
.antMatchers("/").permitAll()
.antMatchers("/join").permitAll()
.antMatchers("/joinForm").permitAll()
.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().authenticated()
.and()
.formLogin() //로그인 페이지에 대해 설정함
.loginPage("/loginForm") //비인가된 경우 로그인 페이지로 이동함
//.usernameParameter("username2") //클라이언트에서 username으로 값을 보내지 않을 때 사용
.loginProcessingUrl("/login") //login 주소가 호출되면 시큐리티가 낚아채서 대신 로그인을 진행한다. - Controller에서 /login 페이지로 이동 안시켜도 됨
.defaultSuccessUrl("/") //성공 시 도달 페이지. + 근데, 특정 페이지로 갔을 때 로그인 요청이 생기면, 로그인 성공 후 이전페이지로 보내줌!!!
.permitAll()
.and()
.logout()
.permitAll()
.and()
.oauth2Login(); //oauth2 정의
//.loginPage("/loginForm") //쓰지 않아도, 인증이 필요한 건 loginForm으로 가게 해뒀기 때문에 loginForm으로 이동은 한다
//.userInfoEndpoint() //oauth 클라이언트의 라이브러리. 토큰+프로필 정보 한방에 받아옴
//.userService(principalOauth2UserService); //userService에 넣어줌
// 구글 로그인 완료된 후 후처리
// 1. 코드받기(인증) 2. 액세스토큰(권한) 3. 사용자 프로필 정보를 가져오고
// 4-1. 그 정보를 토대로 회원가입을 자동으로 진행시키거나
// 4-2. 추가 정보(생년월일, 회원등급 등)이 필요한 경우 추가처리 필요
'TIL' 카테고리의 다른 글
| ORM을 사용하는 이유와 연관관계 매핑 방법 (0) | 2022.06.09 |
|---|---|
| HTTP 프로토콜 (0) | 2022.06.07 |
| [WIL] 넷째주 회고 - 스프링 시큐리티 (0) | 2022.06.05 |
| [Spring] 단축키들 & 어노테이션 (0) | 2022.06.03 |
| [Spring] Exception 처리 (0) | 2022.06.02 |
- Total
- Today
- Yesterday
- AfterEach
- 스프링부트
- 고민
- ManyToOne
- AssertJ
- Java
- 몽고db
- GIT
- OneToMany
- 임포트
- DI
- overfatching
- clean-up policy
- 항해99
- toCharArray
- 제어자
- bean
- 단항연산자
- 상속
- 자바의정석
- 패키지
- jinja2
- IOC
- ManyToMany
- ORM
- controller
- MVC
- 배열
- ResetController
- 서버환경
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
