Skip to content

Commit b30b150

Browse files
committed
Fix login/logout flow and use Redis to store sessions
1 parent 61d4e4e commit b30b150

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

build.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ dependencies {
3131
runtimeOnly 'org.postgresql:postgresql'
3232
// Spring security is used to handle user authentication and authorization
3333
implementation 'org.springframework.boot:spring-boot-starter-security'
34-
// Spring Data Redis is used to interact with Redis, which we use as a key value database to store user sessions
34+
// Spring session is used to manage user sessions using Redis as the session store
3535
implementation("org.springframework.session:spring-session-data-redis")
36+
// Spring Data Redis is used to interact with Redis, which we use as a key value database to store user sessions
37+
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
3638
// Validation starter is used to validate user input
3739
implementation 'org.springframework.boot:spring-boot-starter-validation'
3840
// Web starter is used to build our web APIs (HTTP endpoints)

src/main/java/net/hackyourfuture/coursehub/SecurityConfig.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
2929
config.setAllowCredentials(true);
3030
return config;
3131
}))
32+
// Disable the default logout endpoint as we implemented our own
33+
.logout(AbstractHttpConfigurer::disable)
34+
// Disable the default login (form) endpoint as we implemented our own
35+
.formLogin(AbstractHttpConfigurer::disable)
3236
.authorizeHttpRequests(auth -> auth
3337
// allow CORS pre-flight requests to any endpoint
3438
.requestMatchers(HttpMethod.OPTIONS, "/**")
@@ -37,7 +41,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
3741
// allowing it without authentication so that errors are displayed correctly
3842
.requestMatchers("/error")
3943
.permitAll()
40-
.requestMatchers(HttpMethod.POST, "/login", "/register")
44+
.requestMatchers(HttpMethod.POST, "/login", "/logout", "/register")
4145
.permitAll()
4246
.requestMatchers(HttpMethod.GET, "/courses", "/swagger-ui/**", "/v3/api-docs/**")
4347
.permitAll()

src/main/java/net/hackyourfuture/coursehub/web/UserAuthenticationController.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public UserAuthenticationController(
3838
}
3939

4040
@PostMapping("/login")
41-
public ResponseEntity<Object> login(@RequestBody LoginRequest request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
41+
public ResponseEntity<Object> login(
42+
@RequestBody LoginRequest request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
4243
try {
4344
var response = authenticate(httpRequest, httpResponse, request.emailAddress(), request.password());
4445
return ResponseEntity.ok(response);
@@ -59,7 +60,10 @@ public ResponseEntity<Object> login(@RequestBody LoginRequest request, HttpServl
5960
@PostMapping("/logout")
6061
public ResponseEntity<?> logout(HttpServletRequest httpRequest) {
6162
SecurityContextHolder.clearContext();
62-
httpRequest.getSession().invalidate();
63+
var session = httpRequest.getSession(false);
64+
if (session != null) {
65+
session.invalidate();
66+
}
6367
return ResponseEntity.ok().build();
6468
}
6569

src/main/resources/application.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@ spring.datasource.password=course_user_password
88

99
# Server configuration
1010
server.port=8080
11+
12+
# Session in Redis Configuration
13+
# We want users to stay logged in for 7 days for convenience
14+
spring.session.timeout=7d

0 commit comments

Comments
 (0)