SpringBoot [스프링부트] Spring Security Oauth2 만들기 (4)
이제 SecurityConfig와 LoginController를 만들어보겠습니다.
1. SecurityConfig
@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final CustomOauth2UserService customOauth2UserService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests() // URL에 따른 권한을 관리하는 옵션입니다.
.antMatchers("/").permitAll() //홈페이지인 "/"경로는 모두가 올 수 있습니다.
.antMatchers("/user").hasRole(Role.USER.name()) // "/user"에 대한 경로는 USER를 가진 사람만 올 수 있습니다.
.antMatchers("/guest").authenticated() // "/guest"는 로그인만 했다면 들어올 수 있습니다.
.and()
.logout() // "/logout"은 security에 구현되있으므로 구현하지 않아도 됩니다.
.logoutSuccessUrl("/") //logout을 성공했을 시 돌아가는 경로입니다.
.and()
.oauth2Login() // Oauth2 로그인 기능에 대한 여러 설정의 진입점입니다.
.userInfoEndpoint() // Oauth2 로그인 성공 이후 사용자의 정보를 가져올 때의 설정을 담당합니다.
.userService(customOauth2UserService); // 서버쪽에서 사용자의 정보를 가져온 상태로 추가적인 기능을 설정할 수 있습니다.
// 저희의 경우 DB에 저장하거나 UPDATE하고 Session을 줍니다.
}
}
2. LoginController
@Controller
@RequiredArgsConstructor
public class LoginController {
private final HttpSession httpSession;
@GetMapping("/")
public String index(Model model){
SessionUser loginUser = (SessionUser) httpSession.getAttribute("loginUser");
if(loginUser!=null){
model.addAttribute("user",loginUser);
}
return "/home";
}
@GetMapping("/user")
public String user(Model model){
SessionUser loginUser = (SessionUser) httpSession.getAttribute("loginUser");
model.addAttribute("user",loginUser);
return "/user";
}
@GetMapping("/guest")
public String guest(Model model){
SessionUser loginUser = (SessionUser) httpSession.getAttribute("loginUser");
model.addAttribute("user",loginUser);
return "/guest";
}
}
- session에서 꺼내기 위해 HttpSession을 주입받습니다.
- 홈페이지인 "/"은 누구나 들어올 수 있습니다. 따라서 SessionUser!=null일 때만 model에 담아줍니다.
- "/user"는 User의 권한을 가진 사람만 들어올 수 있습니다. 아닌 사용자는 거부됩니다.
- "/guest"는 로그인만 되어있다면, 누구나 들어올 수 있다 단 로그인을 하지 않았다면 거부됩니다.
3. Html 추가 (html에 대한 포스팅이 아니므로 설명은 생략하겠습니다.)
- resources/templates/ 경로에 guest, home, user를 생성해줍니다.
- home.html ( /oauth2/authorization/google은 google의 로그인을 해주는 곳이며, 로그인을 성공한다면, 저희가 리다이렉션 URL로 적었던 localhost:8080/login/oauth2/code/google로 되며, 이것은 security가 이미 구현을 해놓은 상태입니다. 따라서 요청을 시작한 URL은 localhost:8080/ 이므로 callback이 이용돼 localhost:8080/으로 리다이렉션 됩니다.)
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Home Page</title>
</head>
<h1> Home Page </h1>
<body>
<div class="container">
<div>
<a th:href="@{/oauth2/authorization/google}">google 로그인</a>
<a th:href="@{/logout}">로그 아웃</a>
</div>
</div> <!-- /container -->
<div class="container">
<div th:if="${user}!=null">
<ul>
<li>Username = <span th:text="${user.name}"></span></li>
<li>UserEmail = <span th:text="${user.email}"></span></li>
</ul>
</div>
</div>
</body>
</html>
- guest.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<title>Guest Page</title>
<h1> Guest Page </h1>
<div class="container">
<div th:if="${user}!=null">
<ul>
<li>guest: Username = <span th:text="${user.name}"></span></li>
<li>guest: UserEmail = <span th:text="${user.email}"></span></li>
</ul>
</div>
</div>
</body>
</html>
- user.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<title>User Page</title>
<h1> User Page </h1>
<body>
<div class="container">
<div th:if="${user}!=null">
<ul>
<li>User: Username = <span th:text="${user.name}"></span></li>
<li>User: UserEmail = <span th:text="${user.email}"></span></li>
</ul>
</div>
</div>
</body>
</html>
4. 직접 애플리케이션을 가동해보며, 테스트를 하겠습니다.
- 애플리케이션을 가동한 뒤 localhost:8080/으로 이동해줍니다. 아래와 같이 화면이 뜬다면 google로그인을 눌러줍니다.
- 로그인을 진행해줍니다.
- 로그인이 완료되면 URL은 localhost:8080/#으로 돼있습니다. 또한 로그인이 성공하였으므로 session이 생겨 이름과 이메일이 나옵니다.
- localhost:8080/guest에 접속해봅니다. 해당 URL은 로그인만 되어있다면, 모두 들어올 수 있으므로 성공한 모습을 보입니다.
- localhost:8080/user로 접속하면, 해당 URL은 USER의 권한을 가진 사람만 접근이 가능하므로 403 ERROR가 납니다.
- 그렇다면 OauthAttributes에서 toEntity로 Entity를 만들 때 Role을 GUEST로 고정했던 것을 USER로 바꾸고 다시 "/user"에 접속해보겠습니다. 바꾸고 서버는 재실행해야 합니다.
public User toEntity(){
return User.builder()
.email(email)
.name(name)
.picture(picture)
.role(Role.USER)
.build();
}
정상적으로 실행된 것을 볼 수 있었습니다.
지금까지 기본적인 Oauth2 로그인을 진행했습니다. 위의 경우처럼 권한이 달라 접속하지 못했을 때 별도의 html 보여주는 예외처리와 로그인이 성공했을 때 리다이렉션 주소를 설정해보겠습니다. 감사합니다.
모든 코드는 아래 링크에서 확인 가능합니다.
https://github.com/rlaehdals/Oauth2Example
'SpringBoot > spring security' 카테고리의 다른 글
SpringBoot [스프링부트] Spring Security JWT 만들기(0) (0) | 2022.01.22 |
---|---|
SpringBoot [스프링부트] Spring Security Oauth2 만들기 (5) (0) | 2022.01.22 |
SpringBoot [스프링부트] Sprig Security Oauth2 만들기(3) (0) | 2022.01.20 |
SpringBoot [스프링부트] Spring Security Oauth2 만들기(2) (0) | 2022.01.20 |
SpringBoot [스프링부트] Spring Security Oauth2 만들기(1) (0) | 2022.01.20 |
댓글
이 글 공유하기
다른 글
-
SpringBoot [스프링부트] Spring Security JWT 만들기(0)
SpringBoot [스프링부트] Spring Security JWT 만들기(0)
2022.01.22 -
SpringBoot [스프링부트] Spring Security Oauth2 만들기 (5)
SpringBoot [스프링부트] Spring Security Oauth2 만들기 (5)
2022.01.22 -
SpringBoot [스프링부트] Sprig Security Oauth2 만들기(3)
SpringBoot [스프링부트] Sprig Security Oauth2 만들기(3)
2022.01.20 -
SpringBoot [스프링부트] Spring Security Oauth2 만들기(2)
SpringBoot [스프링부트] Spring Security Oauth2 만들기(2)
2022.01.20