Skip to content

Commit 69cf369

Browse files
Add messages-webapp module
1 parent 3954126 commit 69cf369

File tree

18 files changed

+2753
-2
lines changed

18 files changed

+2753
-2
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.idea
2+
*.iml
3+
target/

.mvn/wrapper/maven-wrapper.jar

61.1 KB
Binary file not shown.

.mvn/wrapper/maven-wrapper.properties

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip
2+
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar

README.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
# spring-security-oauth2-microservices-demo
2-
Spring Security OAuth2 Microservices Demo
1+
# Spring Security OAuth2 Microservices Demo

docker-compose.yml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
version: '3.8'
2+
name: spring-security-oauth2-microservices-demo
3+
services:
4+
keycloak:
5+
image: quay.io/keycloak/keycloak:22.0.3
6+
command: ['start-dev --import-realm']
7+
volumes:
8+
- ./realm-config:/opt/keycloak/data/import
9+
container_name: keycloak
10+
hostname: keycloak
11+
environment:
12+
- KEYCLOAK_ADMIN=admin
13+
- KEYCLOAK_ADMIN_PASSWORD=admin1234
14+
ports:
15+
- "9191:8080"

messages-webapp/.gitignore

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
HELP.md
2+
target/
3+
!.mvn/wrapper/maven-wrapper.jar
4+
!**/src/main/**/target/
5+
!**/src/test/**/target/
6+
7+
### STS ###
8+
.apt_generated
9+
.classpath
10+
.factorypath
11+
.project
12+
.settings
13+
.springBeans
14+
.sts4-cache
15+
16+
### IntelliJ IDEA ###
17+
.idea
18+
*.iws
19+
*.iml
20+
*.ipr
21+
22+
### NetBeans ###
23+
/nbproject/private/
24+
/nbbuild/
25+
/dist/
26+
/nbdist/
27+
/.nb-gradle/
28+
build/
29+
!**/src/main/**/build/
30+
!**/src/test/**/build/
31+
32+
### VS Code ###
33+
.vscode/

messages-webapp/pom.xml

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
5+
https://maven.apache.org/xsd/maven-4.0.0.xsd">
6+
<modelVersion>4.0.0</modelVersion>
7+
<parent>
8+
<groupId>org.springframework.boot</groupId>
9+
<artifactId>spring-boot-starter-parent</artifactId>
10+
<version>3.1.4</version>
11+
<relativePath/> <!-- lookup parent from repository -->
12+
</parent>
13+
<groupId>com.sivalabs</groupId>
14+
<artifactId>messages-webapp</artifactId>
15+
<version>0.0.1-SNAPSHOT</version>
16+
<name>messages-webapp</name>
17+
<properties>
18+
<java.version>17</java.version>
19+
</properties>
20+
<dependencies>
21+
<dependency>
22+
<groupId>org.springframework.boot</groupId>
23+
<artifactId>spring-boot-starter-web</artifactId>
24+
</dependency>
25+
<dependency>
26+
<groupId>org.springframework.boot</groupId>
27+
<artifactId>spring-boot-starter-validation</artifactId>
28+
</dependency>
29+
<dependency>
30+
<groupId>org.springframework.boot</groupId>
31+
<artifactId>spring-boot-starter-oauth2-client</artifactId>
32+
</dependency>
33+
<dependency>
34+
<groupId>org.springframework.boot</groupId>
35+
<artifactId>spring-boot-starter-security</artifactId>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.springframework.boot</groupId>
39+
<artifactId>spring-boot-starter-thymeleaf</artifactId>
40+
</dependency>
41+
<dependency>
42+
<groupId>org.thymeleaf.extras</groupId>
43+
<artifactId>thymeleaf-extras-springsecurity6</artifactId>
44+
</dependency>
45+
<dependency>
46+
<groupId>nz.net.ultraq.thymeleaf</groupId>
47+
<artifactId>thymeleaf-layout-dialect</artifactId>
48+
</dependency>
49+
<dependency>
50+
<groupId>org.springframework.boot</groupId>
51+
<artifactId>spring-boot-starter-test</artifactId>
52+
<scope>test</scope>
53+
</dependency>
54+
<dependency>
55+
<groupId>org.springframework.security</groupId>
56+
<artifactId>spring-security-test</artifactId>
57+
<scope>test</scope>
58+
</dependency>
59+
</dependencies>
60+
61+
<build>
62+
<plugins>
63+
<plugin>
64+
<groupId>org.springframework.boot</groupId>
65+
<artifactId>spring-boot-maven-plugin</artifactId>
66+
</plugin>
67+
</plugins>
68+
</build>
69+
70+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.sivalabs.messages;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class MessagesWebApplication {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(MessagesWebApplication.class, args);
11+
}
12+
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.sivalabs.messages.config;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.security.config.Customizer;
6+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
8+
import org.springframework.security.config.annotation.web.configurers.CorsConfigurer;
9+
import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer;
10+
import org.springframework.security.oauth2.client.oidc.web.logout.OidcClientInitiatedLogoutSuccessHandler;
11+
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
12+
import org.springframework.security.web.SecurityFilterChain;
13+
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
14+
15+
@Configuration
16+
@EnableWebSecurity
17+
public class SecurityConfig {
18+
private final ClientRegistrationRepository clientRegistrationRepository;
19+
20+
public SecurityConfig(ClientRegistrationRepository clientRegistrationRepository) {
21+
this.clientRegistrationRepository = clientRegistrationRepository;
22+
}
23+
24+
@Bean
25+
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
26+
http
27+
.authorizeHttpRequests(c ->
28+
c.requestMatchers("/").permitAll()
29+
.anyRequest().authenticated()
30+
)
31+
.cors(CorsConfigurer::disable)
32+
.csrf(CsrfConfigurer::disable)
33+
.oauth2Login(Customizer.withDefaults())
34+
.logout(logout -> logout
35+
.clearAuthentication(true)
36+
.invalidateHttpSession(true)
37+
.logoutSuccessHandler(oidcLogoutSuccessHandler())
38+
);
39+
return http.build();
40+
}
41+
42+
private LogoutSuccessHandler oidcLogoutSuccessHandler() {
43+
OidcClientInitiatedLogoutSuccessHandler oidcLogoutSuccessHandler =
44+
new OidcClientInitiatedLogoutSuccessHandler(this.clientRegistrationRepository);
45+
oidcLogoutSuccessHandler.setPostLogoutRedirectUri("{baseUrl}/");
46+
return oidcLogoutSuccessHandler;
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.sivalabs.messages.web;
2+
3+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
4+
import org.springframework.security.oauth2.core.user.OAuth2User;
5+
import org.springframework.stereotype.Controller;
6+
import org.springframework.ui.Model;
7+
import org.springframework.web.bind.annotation.GetMapping;
8+
9+
@Controller
10+
public class HomeController {
11+
12+
@GetMapping("/")
13+
public String home(Model model, @AuthenticationPrincipal OAuth2User principal) {
14+
if(principal != null) {
15+
model.addAttribute("username", principal.getAttribute("name"));
16+
} else {
17+
model.addAttribute("username", "Guest");
18+
}
19+
return "home";
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
OAUTH_SERVER=http://localhost:9191/realms/sivalabs
2+
3+
spring.security.oauth2.client.registration.messages-webapp.client-id=messages-webapp
4+
spring.security.oauth2.client.registration.messages-webapp.client-secret=qVcg0foCUNyYbgF0Sg52zeIhLYyOwXpQ
5+
spring.security.oauth2.client.registration.messages-webapp.authorization-grant-type=authorization_code
6+
spring.security.oauth2.client.registration.messages-webapp.scope=openid, profile
7+
spring.security.oauth2.client.registration.messages-webapp.redirect-uri={baseUrl}/login/oauth2/code/messages-webapp
8+
9+
spring.security.oauth2.client.provider.messages-webapp.issuer-uri=${OAUTH_SERVER}
10+
#spring.security.oauth2.client.provider.messages-webapp.authorization-uri=${OAUTH_SERVER}/protocol/openid-connect/auth
11+
#spring.security.oauth2.client.provider.messages-webapp.token-uri=${OAUTH_SERVER}/protocol/openid-connect/token
12+
#spring.security.oauth2.client.provider.messages-webapp.jwk-set-uri=${OAUTH_SERVER}/protocol/openid-connect/certs
13+
#spring.security.oauth2.client.provider.messages-webapp.user-info-uri=${OAUTH_SERVER}/protocol/openid-connect/userinfo
14+
#spring.security.oauth2.client.provider.messages-webapp.user-name-attribute=preferred_username
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!DOCTYPE html>
2+
<html xmlns="http://www.w3.org/1999/xhtml"
3+
xmlns:th="http://www.thymeleaf.org"
4+
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
5+
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity"
6+
layout:decorate="~{layout}">
7+
<head>
8+
<title>Home</title>
9+
</head>
10+
<body>
11+
<div layout:fragment="content">
12+
<h1>Welcome <span th:text="${username}">username</span></h1>
13+
</div>
14+
</body>
15+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<!DOCTYPE html>
2+
<html lang="en"
3+
xmlns="http://www.w3.org/1999/xhtml"
4+
xmlns:th="http://www.thymeleaf.org"
5+
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
6+
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity">
7+
<head>
8+
<meta charset="UTF-8">
9+
<meta name="viewport" content="width=device-width, initial-scale=1">
10+
<title>Messages</title>
11+
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
12+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
13+
</head>
14+
<body>
15+
<nav class="navbar navbar-expand-lg bg-dark border-bottom border-body" data-bs-theme="dark">
16+
<div class="container-fluid">
17+
<a class="navbar-brand" href="#">Messages</a>
18+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
19+
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
20+
aria-expanded="false" aria-label="Toggle navigation">
21+
<span class="navbar-toggler-icon"></span>
22+
</button>
23+
<div class="collapse navbar-collapse" id="navbarSupportedContent">
24+
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
25+
<li class="nav-item">
26+
<a class="nav-link active" aria-current="page" href="/">Home</a>
27+
</li>
28+
</ul>
29+
<ul class="navbar-nav mb-2 mb-lg-0">
30+
<li class="nav-item" sec:authorize="!isAuthenticated()">
31+
<a class="nav-link" href="/oauth2/authorization/messages-webapp">Login</a>
32+
</li>
33+
<li class="nav-item" sec:authorize="isAuthenticated()">
34+
<a class="nav-link" href="/logout">Logout</a>
35+
</li>
36+
</ul>
37+
</div>
38+
</div>
39+
</nav>
40+
<main>
41+
<div class="container">
42+
<div layout:fragment="content">
43+
<!-- Your Page Content Here -->
44+
</div>
45+
</div>
46+
</main>
47+
</body>
48+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.sivalabs.messages;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.boot.test.context.SpringBootTest;
5+
6+
@SpringBootTest
7+
class MessagesWebApplicationTests {
8+
9+
@Test
10+
void contextLoads() {
11+
}
12+
13+
}

0 commit comments

Comments
 (0)