22
22
import com .nimbusds .jose .jwk .source .JWKSource ;
23
23
import com .nimbusds .jose .proc .SecurityContext ;
24
24
import sample .authentication .DeviceClientAuthenticationProvider ;
25
+ import sample .federation .FederatedIdentityAuthenticationSuccessHandler ;
25
26
import sample .federation .FederatedIdentityIdTokenCustomizer ;
26
27
import sample .jose .Jwks ;
27
28
import sample .web .authentication .DeviceClientAuthenticationConverter ;
28
29
29
30
import org .springframework .context .annotation .Bean ;
30
31
import org .springframework .context .annotation .Configuration ;
31
- import org .springframework .core .Ordered ;
32
- import org .springframework .core .annotation .Order ;
33
- import org .springframework .http .MediaType ;
34
32
import org .springframework .jdbc .core .JdbcTemplate ;
35
33
import org .springframework .jdbc .datasource .embedded .EmbeddedDatabase ;
36
34
import org .springframework .jdbc .datasource .embedded .EmbeddedDatabaseBuilder ;
37
35
import org .springframework .jdbc .datasource .embedded .EmbeddedDatabaseType ;
38
36
import org .springframework .security .config .Customizer ;
39
37
import org .springframework .security .config .annotation .web .builders .HttpSecurity ;
38
+ import org .springframework .security .config .annotation .web .configuration .EnableWebSecurity ;
39
+ import org .springframework .security .core .session .SessionRegistry ;
40
+ import org .springframework .security .core .session .SessionRegistryImpl ;
41
+ import org .springframework .security .core .userdetails .User ;
42
+ import org .springframework .security .core .userdetails .UserDetails ;
43
+ import org .springframework .security .core .userdetails .UserDetailsService ;
40
44
import org .springframework .security .oauth2 .core .AuthorizationGrantType ;
41
45
import org .springframework .security .oauth2 .core .ClientAuthenticationMethod ;
42
46
import org .springframework .security .oauth2 .core .oidc .OidcScopes ;
47
51
import org .springframework .security .oauth2 .server .authorization .client .RegisteredClient ;
48
52
import org .springframework .security .oauth2 .server .authorization .client .RegisteredClientRepository ;
49
53
import org .springframework .security .oauth2 .server .authorization .config .annotation .web .configuration .OAuth2AuthorizationServerConfiguration ;
50
- import org .springframework .security .oauth2 .server .authorization .config .annotation .web .configurers .OAuth2AuthorizationServerConfigurer ;
51
54
import org .springframework .security .oauth2 .server .authorization .settings .AuthorizationServerSettings ;
52
55
import org .springframework .security .oauth2 .server .authorization .settings .ClientSettings ;
53
56
import org .springframework .security .oauth2 .server .authorization .settings .TokenSettings ;
54
57
import org .springframework .security .oauth2 .server .authorization .token .JwtEncodingContext ;
55
58
import org .springframework .security .oauth2 .server .authorization .token .OAuth2TokenCustomizer ;
59
+ import org .springframework .security .provisioning .InMemoryUserDetailsManager ;
56
60
import org .springframework .security .web .SecurityFilterChain ;
57
- import org .springframework .security .web .authentication .LoginUrlAuthenticationEntryPoint ;
58
- import org .springframework .security .web .util .matcher .MediaTypeRequestMatcher ;
61
+ import org .springframework .security .web .session .HttpSessionEventPublisher ;
59
62
60
63
import static org .springframework .security .oauth2 .server .authorization .config .annotation .web .configurers .OAuth2AuthorizationServerConfigurer .authorizationServer ;
61
64
65
68
* @author Steve Riesenberg
66
69
* @since 1.1
67
70
*/
71
+ @ EnableWebSecurity
68
72
@ Configuration (proxyBeanMethods = false )
69
73
public class AuthorizationServerConfig {
70
74
private static final String CUSTOM_CONSENT_PAGE_URI = "/oauth2/consent" ;
71
75
72
76
@ Bean
73
- @ Order (Ordered .HIGHEST_PRECEDENCE )
74
77
public SecurityFilterChain authorizationServerSecurityFilterChain (
75
78
HttpSecurity http , RegisteredClientRepository registeredClientRepository ,
76
79
AuthorizationServerSettings authorizationServerSettings ) throws Exception {
@@ -97,43 +100,65 @@ public SecurityFilterChain authorizationServerSecurityFilterChain(
97
100
DeviceClientAuthenticationProvider deviceClientAuthenticationProvider =
98
101
new DeviceClientAuthenticationProvider (registeredClientRepository );
99
102
100
- OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = authorizationServer ();
101
-
102
103
// @formatter:off
103
104
http
104
- .securityMatcher (authorizationServerConfigurer .getEndpointsMatcher ())
105
- .with (authorizationServerConfigurer , (authorizationServer ) ->
105
+ .with (authorizationServer (), (authorizationServer ) ->
106
106
authorizationServer
107
- .deviceAuthorizationEndpoint (deviceAuthorizationEndpoint ->
107
+ .deviceAuthorizationEndpoint (( deviceAuthorizationEndpoint ) ->
108
108
deviceAuthorizationEndpoint .verificationUri ("/activate" )
109
109
)
110
- .deviceVerificationEndpoint (deviceVerificationEndpoint ->
110
+ .deviceVerificationEndpoint (( deviceVerificationEndpoint ) ->
111
111
deviceVerificationEndpoint .consentPage (CUSTOM_CONSENT_PAGE_URI )
112
112
)
113
- .clientAuthentication (clientAuthentication ->
113
+ .clientAuthentication (( clientAuthentication ) ->
114
114
clientAuthentication
115
115
.authenticationConverter (deviceClientAuthenticationConverter )
116
116
.authenticationProvider (deviceClientAuthenticationProvider )
117
117
)
118
- .authorizationEndpoint (authorizationEndpoint ->
118
+ .authorizationEndpoint (( authorizationEndpoint ) ->
119
119
authorizationEndpoint .consentPage (CUSTOM_CONSENT_PAGE_URI ))
120
120
.oidc (Customizer .withDefaults ()) // Enable OpenID Connect 1.0
121
121
)
122
122
.authorizeHttpRequests ((authorize ) ->
123
- authorize .anyRequest ().authenticated ()
123
+ authorize
124
+ .requestMatchers ("/assets/**" , "/login" ).permitAll ()
125
+ .anyRequest ().authenticated ()
124
126
)
125
- // Redirect to the /login page when not authenticated from the authorization endpoint
126
- // NOTE: DefaultSecurityConfig is configured with formLogin.loginPage("/login")
127
- .exceptionHandling ((exceptions ) -> exceptions
128
- .defaultAuthenticationEntryPointFor (
129
- new LoginUrlAuthenticationEntryPoint ("/login" ),
130
- new MediaTypeRequestMatcher (MediaType .TEXT_HTML )
131
- )
127
+ .formLogin ((formLogin ) ->
128
+ formLogin
129
+ .loginPage ("/login" )
130
+ )
131
+ .oauth2Login ((oauth2Login ) ->
132
+ oauth2Login
133
+ .loginPage ("/login" )
134
+ .successHandler (new FederatedIdentityAuthenticationSuccessHandler ())
132
135
);
133
136
// @formatter:on
134
137
return http .build ();
135
138
}
136
139
140
+ // @formatter:off
141
+ @ Bean
142
+ public UserDetailsService users () {
143
+ UserDetails user = User .withDefaultPasswordEncoder ()
144
+ .username ("user1" )
145
+ .password ("password" )
146
+ .roles ("USER" )
147
+ .build ();
148
+ return new InMemoryUserDetailsManager (user );
149
+ }
150
+ // @formatter:on
151
+
152
+ @ Bean
153
+ public SessionRegistry sessionRegistry () {
154
+ return new SessionRegistryImpl ();
155
+ }
156
+
157
+ @ Bean
158
+ public HttpSessionEventPublisher httpSessionEventPublisher () {
159
+ return new HttpSessionEventPublisher ();
160
+ }
161
+
137
162
// @formatter:off
138
163
@ Bean
139
164
public JdbcRegisteredClientRepository registeredClientRepository (JdbcTemplate jdbcTemplate ) {
0 commit comments