Skip to content

Commit a0702bf

Browse files
committed
update samples with spring-security and spring-security-oauth2-authorization-server. 2.x samples fixes #49.
1 parent 5f55487 commit a0702bf

File tree

26 files changed

+287
-2497
lines changed

26 files changed

+287
-2497
lines changed

demo-oauth2/README.md

+6-7
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@
77
1. Client Id: newClient
88
2. Client secret: newClientSecret
99
3. Redirect Uris:
10-
- http://localhost:8081/resource-server/swagger-ui/oauth2-redirect.html
11-
- http://localhost:8082/resource-server/webjars/swagger-ui/oauth2-redirect.html
10+
- http://127.0.0.1:8081/resource-server/swagger-ui/oauth2-redirect.html
11+
- http://127.0.0.1:8082/resource-server/webjars/swagger-ui/oauth2-redirect.html
1212

13-
3. There are two users registered in the Authorization Server:
14-
1. josh@test.com / 123
15-
2. dave@test.com / pass
13+
3. There is a test user registered in the Authorization Server:
14+
- josh@test.com / 123
1615

1716
4. `oauth-resource-server-webmvc` is a Spring Boot WebMVC based RESTFul API, acting as a backend Application
18-
swagger-ui: http://localhost:8081/resource-server/swagger-ui.html
17+
swagger-ui: http://127.0.0.1:8081/resource-server/swagger-ui.html
1918

2019
5. `oauth-resource-server-webflux` is a Spring Boot WebFlux based RESTFul API, acting as a backend Application
21-
swagger-ui: http://localhost:8082/resource-server/swagger-ui.html
20+
swagger-ui: http://127.0.0.1:8082/resource-server/swagger-ui.html
2221

demo-oauth2/oauth-authorization-server/pom.xml

+19-23
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,27 @@
88
<version>3.1.7-SNAPSHOT</version>
99
</parent>
1010
<artifactId>oauth-authorization-server</artifactId>
11-
12-
<dependencyManagement>
13-
<dependencies>
14-
<dependency>
15-
<groupId>com.github.thomasdarimont.embedded-spring-boot-keycloak-server</groupId>
16-
<artifactId>embedded-keycloak-server-spring-boot-parent</artifactId>
17-
<version>5.0.2</version>
18-
<type>pom</type>
19-
<scope>import</scope>
20-
</dependency>
21-
</dependencies>
22-
</dependencyManagement>
23-
2411
<dependencies>
2512
<dependency>
26-
<groupId>com.github.thomasdarimont.embedded-spring-boot-keycloak-server</groupId>
27-
<artifactId>embedded-keycloak-server-spring-boot-starter</artifactId>
28-
<version>5.0.2</version>
13+
<groupId>org.springframework.security</groupId>
14+
<artifactId>spring-security-oauth2-authorization-server</artifactId>
15+
<version>1.0.0-SNAPSHOT</version>
16+
</dependency>
17+
<dependency>
18+
<groupId>org.springframework.boot</groupId>
19+
<artifactId>spring-boot-starter-web</artifactId>
20+
</dependency>
21+
<dependency>
22+
<groupId>org.springframework.boot</groupId>
23+
<artifactId>spring-boot-starter-security</artifactId>
24+
</dependency>
25+
<dependency>
26+
<groupId>org.springframework.boot</groupId>
27+
<artifactId>spring-boot-starter-jdbc</artifactId>
28+
</dependency>
29+
<dependency>
30+
<groupId>com.h2database</groupId>
31+
<artifactId>h2</artifactId>
2932
</dependency>
3033
</dependencies>
31-
32-
<repositories>
33-
<repository>
34-
<id>jitpack.io</id>
35-
<url>https://jitpack.io</url>
36-
</repository>
37-
</repositories>
3834
</project>

demo-oauth2/oauth-authorization-server/src/main/java/org/springdoc/demo/auth/AuthorizationServerApp.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5-
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
65

7-
@SpringBootApplication(exclude = LiquibaseAutoConfiguration.class)
6+
@SpringBootApplication
87
public class AuthorizationServerApp {
98

10-
public static void main(String[] args) throws Exception {
9+
public static void main(String[] args) {
1110
SpringApplication.run(AuthorizationServerApp.class, args);
1211
}
13-
14-
1512
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.springdoc.demo.auth;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
6+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
7+
import org.springframework.security.core.userdetails.User;
8+
import org.springframework.security.core.userdetails.UserDetails;
9+
import org.springframework.security.core.userdetails.UserDetailsService;
10+
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
11+
import org.springframework.security.web.SecurityFilterChain;
12+
13+
import static org.springframework.security.config.Customizer.withDefaults;
14+
15+
@EnableWebSecurity
16+
@Configuration(proxyBeanMethods = false)
17+
public class DefaultSecurityConfig {
18+
19+
@Bean
20+
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
21+
http
22+
.authorizeHttpRequests(authorize ->
23+
authorize.anyRequest().authenticated()
24+
)
25+
.formLogin(withDefaults());
26+
return http.build();
27+
}
28+
29+
@Bean
30+
UserDetailsService users() {
31+
UserDetails user = User.withDefaultPasswordEncoder()
32+
.username("josh@test.com")
33+
.password("123")
34+
.roles("USER")
35+
.build();
36+
return new InMemoryUserDetailsManager(user);
37+
}
38+
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.springdoc.demo.auth;
2+
3+
import java.security.KeyPair;
4+
import java.security.interfaces.RSAPrivateKey;
5+
import java.security.interfaces.RSAPublicKey;
6+
import java.util.UUID;
7+
8+
import com.nimbusds.jose.jwk.RSAKey;
9+
10+
public final class Jwks {
11+
12+
private Jwks() {
13+
}
14+
15+
public static RSAKey generateRsa() {
16+
KeyPair keyPair = KeyGeneratorUtils.generateRsaKey();
17+
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
18+
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
19+
return new RSAKey.Builder(publicKey)
20+
.privateKey(privateKey)
21+
.keyID(UUID.randomUUID().toString())
22+
.build();
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.springdoc.demo.auth;
2+
3+
import java.math.BigInteger;
4+
import java.security.KeyPair;
5+
import java.security.KeyPairGenerator;
6+
import java.security.spec.ECFieldFp;
7+
import java.security.spec.ECParameterSpec;
8+
import java.security.spec.ECPoint;
9+
import java.security.spec.EllipticCurve;
10+
11+
final class KeyGeneratorUtils {
12+
13+
private KeyGeneratorUtils() {
14+
}
15+
16+
static KeyPair generateRsaKey() {
17+
KeyPair keyPair;
18+
try {
19+
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
20+
keyPairGenerator.initialize(2048);
21+
keyPair = keyPairGenerator.generateKeyPair();
22+
} catch (Exception ex) {
23+
throw new IllegalStateException(ex);
24+
}
25+
return keyPair;
26+
}
27+
28+
static KeyPair generateEcKey() {
29+
EllipticCurve ellipticCurve = new EllipticCurve(
30+
new ECFieldFp(
31+
new BigInteger("115792089210356248762697446949407573530086143415290314195533631308867097853951")),
32+
new BigInteger("115792089210356248762697446949407573530086143415290314195533631308867097853948"),
33+
new BigInteger("41058363725152142129326129780047268409114441015993725554835256314039467401291"));
34+
ECPoint ecPoint = new ECPoint(
35+
new BigInteger("48439561293906451759052585252797914202762949526041747995844080717082404635286"),
36+
new BigInteger("36134250956749795798585127919587881956611106672985015071877198253568414405109"));
37+
ECParameterSpec ecParameterSpec = new ECParameterSpec(
38+
ellipticCurve,
39+
ecPoint,
40+
new BigInteger("115792089210356248762697446949407573529996955224135760342422259061068512044369"),
41+
1);
42+
43+
KeyPair keyPair;
44+
try {
45+
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
46+
keyPairGenerator.initialize(ecParameterSpec);
47+
keyPair = keyPairGenerator.generateKeyPair();
48+
} catch (Exception ex) {
49+
throw new IllegalStateException(ex);
50+
}
51+
return keyPair;
52+
}
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package org.springdoc.demo.auth;
2+
3+
import java.util.UUID;
4+
5+
import com.nimbusds.jose.jwk.JWKSet;
6+
import com.nimbusds.jose.jwk.RSAKey;
7+
import com.nimbusds.jose.jwk.source.JWKSource;
8+
import com.nimbusds.jose.proc.SecurityContext;
9+
10+
import org.springframework.context.annotation.Bean;
11+
import org.springframework.context.annotation.Configuration;
12+
import org.springframework.core.Ordered;
13+
import org.springframework.core.annotation.Order;
14+
import org.springframework.jdbc.core.JdbcTemplate;
15+
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
16+
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
17+
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
18+
import org.springframework.security.config.Customizer;
19+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
20+
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;
21+
import org.springframework.security.oauth2.core.AuthorizationGrantType;
22+
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
23+
import org.springframework.security.oauth2.core.oidc.OidcScopes;
24+
import org.springframework.security.oauth2.jwt.JwtDecoder;
25+
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationConsentService;
26+
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
27+
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;
28+
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
29+
import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository;
30+
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
31+
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
32+
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
33+
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
34+
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
35+
import org.springframework.security.web.SecurityFilterChain;
36+
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
37+
import org.springframework.web.cors.CorsConfiguration;
38+
39+
40+
@Configuration(proxyBeanMethods = false)
41+
public class SecurityConfig {
42+
43+
@Bean
44+
@Order(Ordered.HIGHEST_PRECEDENCE)
45+
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
46+
OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
47+
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
48+
.oidc(Customizer.withDefaults());
49+
http.cors().configurationSource(request -> new CorsConfiguration().applyPermitDefaultValues())
50+
.and()
51+
.exceptionHandling(exceptions ->
52+
exceptions.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))
53+
)
54+
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
55+
return http.build();
56+
}
57+
58+
@Bean
59+
public RegisteredClientRepository registeredClientRepository(JdbcTemplate jdbcTemplate) {
60+
RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
61+
.clientId("newClient")
62+
.clientSecret("{noop}newClientSecret")
63+
.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST)
64+
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
65+
.authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
66+
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
67+
.redirectUri("http://127.0.0.1:8081/resource-server/swagger-ui/oauth2-redirect.html")
68+
.redirectUri("http://127.0.0.1:8082/resource-server/webjars/swagger-ui/oauth2-redirect.html")
69+
.redirectUri("http://158.101.191.70:8095/resource-server/swagger-ui/oauth2-redirect.html")
70+
.redirectUri("http://158.101.191.70:8096/resource-server/webjars/swagger-ui/oauth2-redirect.html")
71+
.scope(OidcScopes.OPENID)
72+
.scope(OidcScopes.PROFILE)
73+
.scope("springdoc.read")
74+
.scope("springdoc.write")
75+
.build();
76+
77+
// Save registered client in db as if in-memory
78+
JdbcRegisteredClientRepository registeredClientRepository = new JdbcRegisteredClientRepository(jdbcTemplate);
79+
registeredClientRepository.save(registeredClient);
80+
81+
return registeredClientRepository;
82+
}
83+
84+
@Bean
85+
public OAuth2AuthorizationService authorizationService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {
86+
return new JdbcOAuth2AuthorizationService(jdbcTemplate, registeredClientRepository);
87+
}
88+
89+
@Bean
90+
public OAuth2AuthorizationConsentService authorizationConsentService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {
91+
return new JdbcOAuth2AuthorizationConsentService(jdbcTemplate, registeredClientRepository);
92+
}
93+
94+
@Bean
95+
public JWKSource<SecurityContext> jwkSource() {
96+
RSAKey rsaKey = Jwks.generateRsa();
97+
JWKSet jwkSet = new JWKSet(rsaKey);
98+
return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
99+
}
100+
101+
@Bean
102+
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
103+
return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
104+
}
105+
106+
@Bean
107+
public AuthorizationServerSettings authorizationServerSettings() {
108+
return AuthorizationServerSettings.builder().build();
109+
}
110+
111+
@Bean
112+
public EmbeddedDatabase embeddedDatabase() {
113+
return new EmbeddedDatabaseBuilder()
114+
.generateUniqueName(true)
115+
.setType(EmbeddedDatabaseType.H2)
116+
.setScriptEncoding("UTF-8")
117+
.addScript("org/springframework/security/oauth2/server/authorization/oauth2-authorization-schema.sql")
118+
.addScript("org/springframework/security/oauth2/server/authorization/oauth2-authorization-consent-schema.sql")
119+
.addScript("org/springframework/security/oauth2/server/authorization/client/oauth2-registered-client-schema.sql")
120+
.build();
121+
}
122+
123+
}

demo-oauth2/oauth-authorization-server/src/main/resources/application.yml

+5-15
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,8 @@ server:
1212

1313
logging:
1414
level:
15-
org.jgroups: INFO
16-
org.infinispan: INFO
17-
org.keycloak: INFO
18-
org.keycloak.services.managers.DefaultBruteForceProtector: DEBUG
19-
org.keycloak.services.scheduled.ClusterAwareScheduledTaskRunner: DEBUG
20-
org.keycloak.services.managers.UserSessionManager: DEBUG
21-
org.keycloak.timer.basic: DEBUG
22-
23-
keycloak:
24-
custom:
25-
server:
26-
keycloak-path: "/auth"
27-
migration:
28-
importProvider: singleFile
29-
importLocation: "file:springdoc-realm.json"
15+
root: INFO
16+
org.springframework.web: INFO
17+
org.springframework.security: INFO
18+
org.springframework.security.oauth2: INFO
19+
org.springframework.boot.autoconfigure: INFO

demo-oauth2/oauth-authorization-server/src/main/resources/banner.txt

-9
This file was deleted.

0 commit comments

Comments
 (0)