Skip to content

Commit

Permalink
구글 소셜 로그인 - 로그아웃, 로그인 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
chobeebee committed Jun 29, 2024
1 parent ce3136e commit d605951
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 35 deletions.
79 changes: 63 additions & 16 deletions src/main/java/com/sparta/binplay/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.sparta.binplay.config;

import com.sparta.binplay.jwt.JWTFilter;
import com.sparta.binplay.oauth2.CustomLogoutSuccessHandler;
import com.sparta.binplay.oauth2.CustomSuccessHandler;
import com.sparta.binplay.service.CustomOAuth2UserService;
import com.sparta.binplay.service.JWTUtil;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
Expand All @@ -13,20 +15,23 @@
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutHandler;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;

import java.io.IOException;

@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final CustomOAuth2UserService customOAuth2UserService;
private final CustomSuccessHandler customSuccessHandler;
private final JWTUtil jwtUtil;
private final CustomLogoutSuccessHandler customLogoutSuccessHandler;
//private final CustomLogoutSuccessHandler customLogoutSuccessHandler;

public SecurityConfig(CustomOAuth2UserService customOAuth2UserService, CustomSuccessHandler customSuccessHandler, JWTUtil jwtUtil, CustomLogoutSuccessHandler customLogoutSuccessHandler) {
public SecurityConfig(CustomOAuth2UserService customOAuth2UserService, CustomSuccessHandler customSuccessHandler, JWTUtil jwtUtil) {
this.customOAuth2UserService = customOAuth2UserService;
this.customSuccessHandler = customSuccessHandler;
this.jwtUtil = jwtUtil;
this.customLogoutSuccessHandler = customLogoutSuccessHandler;
}

@Bean
Expand All @@ -44,12 +49,6 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.httpBasic((auth) -> auth.disable());

//JWTFilter
http
.addFilterBefore(new JWTFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class);
http
.addFilterAfter(new JWTFilter(jwtUtil), OAuth2LoginAuthenticationFilter.class);

//oauth2 로그인 설정
http
.oauth2Login((oauth2) -> oauth2
Expand All @@ -58,25 +57,73 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.successHandler(customSuccessHandler)
);

//JWTFilter
http
.addFilterBefore(new JWTFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class) //form 로그인 끄면 아예 안 쓰는 애
.addFilterAfter(new JWTFilter(jwtUtil), OAuth2LoginAuthenticationFilter.class);

//경로별 인가 작업
http
.authorizeHttpRequests((auth) -> auth
.requestMatchers("/oauth2/authorization/google").permitAll() //구글만
//.requestMatchers("/oauth2/authorization/*").permitAll() //여러 소셜 로그인 있을 경우
.requestMatchers("/").permitAll()
.anyRequest().authenticated());

//세션 설정 : STATELESS
http
.sessionManagement((session) -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
// // CORS 설정
// http
// .cors(corsCustomizer -> corsCustomizer.configurationSource(request -> {
//
// CorsConfiguration configuration = new CorsConfiguration();
//
// configuration.setAllowedOrigins(Collections.singletonList("http://localhost:3000"));
// configuration.setAllowedMethods(Collections.singletonList("*"));
// configuration.setAllowCredentials(true);
// configuration.setAllowedHeaders(Collections.singletonList("*"));
// configuration.setMaxAge(3600L);
//
// configuration.setExposedHeaders(Collections.singletonList("Set-Cookie"));
// configuration.setExposedHeaders(Collections.singletonList("Authorization"));
//
// return configuration;
// }));

//로그아웃 설정
http
.logout((oauth2) -> oauth2
.logoutUrl("/api/auth/logout") // 로그아웃 URL 설정
.logoutSuccessUrl("/") // 로그아웃 성공 후 리디렉션 URL 설정
.deleteCookies("JSESSIONID") // 쿠키 삭제 설정
.invalidateHttpSession(true) // 세션 무효화 설정
.permitAll());
.logout((logout) -> logout
.logoutUrl("/api/auth/logout")
.addLogoutHandler(new LogoutHandler() {
@Override
public void logout(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.Authentication authentication) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("Authorization") ||
cookie.getName().equals("JSESSIONID") ||
cookie.getName().equals("__Host-GAPS")) {
cookie.setValue(null);
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}
}
}
// Invalidate the session
request.getSession().invalidate();
}
})
.logoutSuccessHandler(new LogoutSuccessHandler() {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.Authentication authentication) throws IOException {
response.setStatus(HttpServletResponse.SC_OK);
response.sendRedirect("/");
}
})
);

return http.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public String mainAPI() {

@GetMapping("/loginTest")
@ResponseBody
public String loginAPI() {
public String loginTest() {
return "login route";
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/sparta/binplay/controller/MyController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

@GetMapping("/my")
@ResponseBody
public String myAPI() {
return "my route";
}
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/com/sparta/binplay/entity/CustomOAuth2User.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
package com.sparta.binplay.entity;

import com.sparta.binplay.dto.UserDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.core.user.OAuth2User;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;

@RequiredArgsConstructor
public class CustomOAuth2User implements OAuth2User {
private final UserDTO userDTO;

public CustomOAuth2User(UserDTO userDTO) {
this.userDTO = userDTO;
}

@Override
public Map<String, Object> getAttributes() {
return null;
Expand Down
26 changes: 17 additions & 9 deletions src/main/java/com/sparta/binplay/jwt/JWTFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,42 @@
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;

@RequiredArgsConstructor
public class JWTFilter extends OncePerRequestFilter {

private final JWTUtil jwtUtil;

public JWTFilter(JWTUtil jwtUtil) {

this.jwtUtil = jwtUtil;
@Override
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
String path = request.getRequestURI();
// 로그인 경로를 제외하도록 설정
//return path.startsWith("/login") || path.startsWith("/oauth2/authorization");
return path.startsWith("/oauth2/authorization/google");
}

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, IOException {

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
System.out.println("까꿍");
//cookie들을 불러온 뒤 Authorization Key에 담긴 쿠키를 찾음
String authorization = null;
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {

System.out.println(cookie.getName());
if (cookie.getName().equals("Authorization")) {
if (cookies != null) {
for (Cookie cookie : cookies) {

System.out.println(cookie.getName());
if (cookie.getName().equals("Authorization")) {

authorization = cookie.getValue();
authorization = cookie.getValue();
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,6 @@ public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse resp
System.out.println("JSESSIONID and Authorization cookies deleted");

// 로그아웃 성공 후 리디렉션
response.sendRedirect("/loginTest");
response.sendRedirect("/login");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,17 @@
import com.sparta.binplay.entity.Role;
import com.sparta.binplay.entity.Users;
import com.sparta.binplay.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

@RequiredArgsConstructor
@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
private final UserRepository userRepository;

public CustomOAuth2UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}

//유저 정보 DB 저장
@Override
Expand Down

0 comments on commit d605951

Please sign in to comment.