Skip to content

Commit 9329446

Browse files
committed
(step2) httpSecurity - OAuth2LoginConfigurer를 이용한 OAuth2 리다이렉트, 인증 필터 등록
1 parent 58387a8 commit 9329446

File tree

7 files changed

+70
-10
lines changed

7 files changed

+70
-10
lines changed

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828

2929
## 2단계 - 인증 관련 리팩토링
3030

31-
- [ ] `.formLogin()` 메서드를 사용하여 폼 로그인 기능을 설정하고, U`sernamePasswordAuthenticationFilter`를 자동으로 추가한다.
32-
- [ ] `.httpBasic()` 메서드를 사용해 HTTP Basic 인증을 설정하고, `BasicAuthenticationFilter`를 자동으로 추가한다.
33-
- [ ] `securityContext()`는 유저가 직접 설정할 수 없도록 하고, HttpSecurity가 빈으로 등록될 때 자동으로 설정한다.
31+
- [x] `.formLogin()` 메서드를 사용하여 폼 로그인 기능을 설정하고, U`sernamePasswordAuthenticationFilter`를 자동으로 추가한다.
32+
- [x] `.httpBasic()` 메서드를 사용해 HTTP Basic 인증을 설정하고, `BasicAuthenticationFilter`를 자동으로 추가한다.
33+
- [x] `.securityContext()` 메서드를 사용하여 `SecurityContextHolderFilter` 자동으로 추가
34+
- [x] oauth2 리팩토링
35+
- [x] OAuth2AuthorizationRequestRedirectFilter 등록, OAuth2LoginAuthenticationFilter 등록
3436

3537
## 3단계 - 인가 관련 리팩토링
3638

src/main/java/nextstep/app/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public SecurityFilterChain securityFilterChain2(HttpSecurity http) {
8383
.csrf(c -> c.ignoringRequestMatchers("/login"))
8484
.formLogin(Customizer.withDefaults())
8585
.httpBasic(Customizer.withDefaults())
86+
.oauth2Login(Customizer.withDefaults())
8687
.build();
8788
}
8889

src/main/java/nextstep/oauth2/web/OAuth2AuthorizationRequestRedirectFilter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import jakarta.servlet.http.HttpServletResponse;
77
import nextstep.oauth2.endpoint.OAuth2AuthorizationRequest;
88
import nextstep.oauth2.registration.ClientRegistrationRepository;
9+
import org.springframework.util.Assert;
910
import org.springframework.web.filter.OncePerRequestFilter;
1011

1112
import java.io.IOException;
@@ -19,6 +20,7 @@ public class OAuth2AuthorizationRequestRedirectFilter extends OncePerRequestFilt
1920
private final AuthorizationRequestRepository authorizationRequestRepository = new AuthorizationRequestRepository();
2021

2122
public OAuth2AuthorizationRequestRedirectFilter(ClientRegistrationRepository clientRegistrationRepository) {
23+
Assert.notNull(clientRegistrationRepository, "clientRegistrationRepository cannot be null");
2224
authorizationRequestResolver = new OAuth2AuthorizationRequestResolver(clientRegistrationRepository, DEFAULT_AUTHORIZATION_REQUEST_BASE_URI);
2325
}
2426

src/main/java/nextstep/oauth2/web/OAuth2LoginAuthenticationFilter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ public class OAuth2LoginAuthenticationFilter extends AbstractAuthenticationProce
3333

3434
public OAuth2LoginAuthenticationFilter(ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository authorizedClientRepository, AuthenticationManager authenticationManager) {
3535
super(DEFAULT_LOGIN_REQUEST_BASE_URI, authenticationManager);
36+
37+
Assert.notNull(authenticationManager, "authenticationManager cannot be null");
38+
Assert.notNull(clientRegistrationRepository, "clientRegistrationRepository cannot be null");
39+
Assert.notNull(authorizedClientRepository, "authorizationRequestRepository cannot be null");
40+
3641
this.clientRegistrationRepository = clientRegistrationRepository;
3742
this.authorizedClientRepository = authorizedClientRepository;
3843
}

src/main/java/nextstep/security/config/annotation/web/builders/HttpSecurity.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
import nextstep.security.config.DefaultSecurityFilterChain;
77
import nextstep.security.config.SecurityFilterChain;
88
import nextstep.security.config.annotation.web.SecurityConfigurer;
9-
import nextstep.security.config.annotation.web.configurers.CsrfConfigurer;
10-
import nextstep.security.config.annotation.web.configurers.FormLoginConfigurer;
11-
import nextstep.security.config.annotation.web.configurers.HttpBasicConfigurer;
12-
import nextstep.security.config.annotation.web.configurers.SecurityContextConfigurer;
9+
import nextstep.security.config.annotation.web.configurers.*;
1310

1411
import java.util.*;
1512

@@ -19,8 +16,9 @@ public class HttpSecurity {
1916
private final List<Filter> filters = new ArrayList<>();
2017
private final Map<Class<?>, Object> sharedObjects = new HashMap<>();
2118

22-
public HttpSecurity(AuthenticationManager authenticationManager) {
19+
public HttpSecurity(AuthenticationManager authenticationManager, Map<Class<?>, Object> sharedObjects) {
2320
setSharedObject(AuthenticationManager.class, authenticationManager);
21+
this.sharedObjects.putAll(sharedObjects);
2422
}
2523

2624
public <C> C getSharedObject(Class<C> sharedType) {
@@ -64,6 +62,11 @@ public HttpSecurity httpBasic(Customizer<HttpBasicConfigurer> httpBasicCustomize
6462
return this;
6563
}
6664

65+
public HttpSecurity oauth2Login(Customizer<OAuth2LoginConfigurer> oauth2LoginCustomizer) {
66+
oauth2LoginCustomizer.customize(getOrApply(new OAuth2LoginConfigurer()));
67+
return this;
68+
}
69+
6770
public HttpSecurity authorizeHttpRequests() {
6871
return this;
6972
}

src/main/java/nextstep/security/config/annotation/web/configuration/HttpSecurityConfiguration.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,29 @@
33
import nextstep.security.authentication.AuthenticationManager;
44
import nextstep.security.config.Customizer;
55
import nextstep.security.config.annotation.web.builders.HttpSecurity;
6+
import org.springframework.context.ApplicationContext;
67
import org.springframework.context.annotation.Bean;
78
import org.springframework.context.annotation.Configuration;
89

10+
import java.util.Map;
11+
912
@Configuration
1013
public class HttpSecurityConfiguration {
1114

1215
@Bean
13-
HttpSecurity httpSecurity(AuthenticationManager authenticationManager) {
14-
HttpSecurity http = new HttpSecurity(authenticationManager);
16+
HttpSecurity httpSecurity(
17+
ApplicationContext applicationContext,
18+
AuthenticationManager authenticationManager
19+
) {
20+
HttpSecurity http = new HttpSecurity(authenticationManager, createSharedObjects(applicationContext));
1521

1622
http
1723
.securityContext(Customizer.withDefaults());
1824

1925
return http;
2026
}
27+
28+
private Map<Class<?>, Object> createSharedObjects(ApplicationContext applicationContext) {
29+
return Map.of(ApplicationContext.class, applicationContext);
30+
}
2131
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package nextstep.security.config.annotation.web.configurers;
2+
3+
import nextstep.oauth2.registration.ClientRegistrationRepository;
4+
import nextstep.oauth2.web.OAuth2AuthorizationRequestRedirectFilter;
5+
import nextstep.oauth2.web.OAuth2AuthorizedClientRepository;
6+
import nextstep.oauth2.web.OAuth2LoginAuthenticationFilter;
7+
import nextstep.security.authentication.AuthenticationManager;
8+
import nextstep.security.config.annotation.web.SecurityConfigurer;
9+
import nextstep.security.config.annotation.web.builders.HttpSecurity;
10+
import org.springframework.context.ApplicationContext;
11+
12+
public class OAuth2LoginConfigurer implements SecurityConfigurer {
13+
14+
private AuthenticationManager authenticationManager;
15+
private ClientRegistrationRepository clientRegistrationRepository;
16+
private OAuth2AuthorizedClientRepository oAuth2AuthorizedClientRepository;
17+
18+
@Override
19+
public void init(HttpSecurity http) {
20+
this.authenticationManager = http.getSharedObject(AuthenticationManager.class);
21+
this.clientRegistrationRepository = http.getSharedObject(ApplicationContext.class).getBean(ClientRegistrationRepository.class);
22+
this.oAuth2AuthorizedClientRepository = new OAuth2AuthorizedClientRepository();
23+
}
24+
25+
@Override
26+
public void configure(HttpSecurity http) {
27+
OAuth2AuthorizationRequestRedirectFilter redirectFilter = new OAuth2AuthorizationRequestRedirectFilter(clientRegistrationRepository);
28+
http.addFilter(redirectFilter);
29+
30+
OAuth2LoginAuthenticationFilter authenticationFilter = new OAuth2LoginAuthenticationFilter(
31+
clientRegistrationRepository,
32+
oAuth2AuthorizedClientRepository,
33+
authenticationManager
34+
);
35+
http.addFilter(authenticationFilter);
36+
}
37+
}

0 commit comments

Comments
 (0)