Skip to content

Commit 4acd099

Browse files
authored
Merge pull request #5 from alwinsimon/v1-dev-auth
V1 dev auth - Completed Auth Configurations.
2 parents 6559480 + add1188 commit 4acd099

File tree

12 files changed

+256
-11
lines changed

12 files changed

+256
-11
lines changed

src/main/java/com/alwinsimon/UserManagementJavaSpringBoot/Config/ApplicationConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
import org.springframework.security.authentication.AuthenticationProvider;
99
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
1010
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
11+
import org.springframework.security.core.context.SecurityContextHolder;
1112
import org.springframework.security.core.userdetails.UserDetailsService;
1213
import org.springframework.security.core.userdetails.UsernameNotFoundException;
1314
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
1415
import org.springframework.security.crypto.password.PasswordEncoder;
1516

17+
import java.security.Principal;
18+
1619
@Configuration
1720
@RequiredArgsConstructor
1821
public class ApplicationConfig {
@@ -54,4 +57,9 @@ public AuthenticationManager authenticationManager(AuthenticationConfiguration a
5457

5558
}
5659

60+
@Bean
61+
public Principal principal() throws Exception {
62+
return () -> SecurityContextHolder.getContext().getAuthentication().getName();
63+
}
64+
5765
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
public class AuthenticationRequest {
13+
14+
private String email;
15+
16+
private String password;
17+
18+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
public class AuthenticationResponse {
13+
14+
private String token;
15+
16+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.lang.Nullable;
6+
import org.springframework.web.cors.CorsConfiguration;
7+
import org.springframework.web.cors.CorsConfigurationSource;
8+
9+
import java.util.Arrays;
10+
import java.util.Collections;
11+
12+
@Configuration
13+
public class CorsConfig implements CorsConfigurationSource {
14+
15+
@Override
16+
@Nullable
17+
public CorsConfiguration getCorsConfiguration(HttpServletRequest arg0) {
18+
CorsConfiguration config = new CorsConfiguration();
19+
config.setAllowedOrigins(Collections.singletonList("*"));
20+
config.setAllowedMethods(Collections.singletonList("*"));
21+
config.setAllowCredentials(true);
22+
config.setAllowedHeaders(Collections.singletonList("*"));
23+
config.setExposedHeaders(Arrays.asList("Authorization"));
24+
config.setMaxAge(3600L);
25+
26+
return config;
27+
}
28+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
public class RegisterRequest {
13+
14+
private String name;
15+
16+
private String gender;
17+
18+
private String email;
19+
20+
private String password;
21+
22+
}

src/main/java/com/alwinsimon/UserManagementJavaSpringBoot/Config/SecurityConfig.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.alwinsimon.UserManagementJavaSpringBoot.Config;
22

3+
import com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth.CorsConfig;
34
import com.alwinsimon.UserManagementJavaSpringBoot.Config.Filter.JwtAuthenticationFilter;
4-
import jakarta.servlet.Filter;
55
import lombok.RequiredArgsConstructor;
6+
import org.springframework.beans.factory.annotation.Autowired;
67
import org.springframework.context.annotation.Bean;
78
import org.springframework.context.annotation.Configuration;
89
import org.springframework.security.authentication.AuthenticationProvider;
@@ -20,18 +21,22 @@ public class SecurityConfig {
2021
private final JwtAuthenticationFilter jwtAuthenticationFilter;
2122
private final AuthenticationProvider authenticationProvider;
2223

24+
@Autowired
25+
private CorsConfig corsConfig;
26+
2327
@Bean
2428
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
2529

2630
http
2731
.csrf((csrf) -> csrf.disable())
28-
.authorizeHttpRequests(authorize ->authorize
29-
.requestMatchers("/health/","/api/v1/auth/**")
32+
.cors(cors -> cors.configurationSource(corsConfig))
33+
.authorizeHttpRequests(authorize -> authorize
34+
.requestMatchers("/health/", "/api/v1/auth/**")
3035
.permitAll()
3136
.anyRequest()
3237
.authenticated()
3338
)
34-
.sessionManagement((session)->session
39+
.sessionManagement((session) -> session
3540
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
3641
)
3742
.authenticationProvider(authenticationProvider)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.alwinsimon.UserManagementJavaSpringBoot.Controller;
2+
3+
import com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth.AuthenticationRequest;
4+
import com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth.AuthenticationResponse;
5+
import com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth.RegisterRequest;
6+
import com.alwinsimon.UserManagementJavaSpringBoot.Service.AuthenticationService;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.PostMapping;
10+
import org.springframework.web.bind.annotation.RequestBody;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
@RestController
15+
@RequestMapping("/api/v1/auth")
16+
@RequiredArgsConstructor
17+
public class AuthenticationController {
18+
19+
private final AuthenticationService authenticationService;
20+
21+
@PostMapping("/register")
22+
public ResponseEntity<AuthenticationResponse> register(
23+
@RequestBody RegisterRequest request
24+
) {
25+
26+
return ResponseEntity.ok(authenticationService.register(request));
27+
28+
}
29+
30+
@PostMapping("/authenticate")
31+
public ResponseEntity<AuthenticationResponse> authenticate(
32+
@RequestBody AuthenticationRequest request
33+
) {
34+
35+
return ResponseEntity.ok(authenticationService.authenticate(request));
36+
37+
}
38+
39+
}
Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
package com.alwinsimon.UserManagementJavaSpringBoot.Controller;
22

3-
import org.springframework.web.bind.annotation.*;
4-
//import com.alwinsimon.UserManagementJavaSpringBoot.Model.User;
3+
import com.alwinsimon.UserManagementJavaSpringBoot.Model.User;
4+
import com.alwinsimon.UserManagementJavaSpringBoot.Service.UserService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.web.bind.annotation.CrossOrigin;
7+
import org.springframework.web.bind.annotation.GetMapping;
8+
import org.springframework.web.bind.annotation.RequestMapping;
9+
import org.springframework.web.bind.annotation.RestController;
510

611
@RestController
712
@RequestMapping("/api/v1/user")
13+
@RequiredArgsConstructor
814
@CrossOrigin("*")
915
public class UserController {
10-
@PostMapping("/register")
11-
public String addUser(@RequestBody String requestBody){
12-
System.out.println("Received request body: " + requestBody);
13-
return requestBody;
16+
17+
private final UserService userService;
18+
19+
@GetMapping("/current-user")
20+
public User getCurrentUser() {
21+
22+
// API Endpoint to get the LoggedIn User Details using Token received in the Request Header.
23+
return userService.currentUserDetails();
24+
1425
}
1526
}

src/main/java/com/alwinsimon/UserManagementJavaSpringBoot/Model/User.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.alwinsimon.UserManagementJavaSpringBoot.Model;
22

33
import jakarta.persistence.*;
4+
import lombok.Builder;
45
import lombok.Data;
56
import lombok.AllArgsConstructor;
67
import lombok.NoArgsConstructor;
@@ -12,6 +13,7 @@
1213
import java.util.List;
1314

1415
@Data
16+
@Builder
1517
@AllArgsConstructor
1618
@NoArgsConstructor
1719
@Entity
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.alwinsimon.UserManagementJavaSpringBoot.Service;
2+
3+
import com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth.AuthenticationRequest;
4+
import com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth.AuthenticationResponse;
5+
import com.alwinsimon.UserManagementJavaSpringBoot.Config.Auth.RegisterRequest;
6+
import com.alwinsimon.UserManagementJavaSpringBoot.Model.Role;
7+
import com.alwinsimon.UserManagementJavaSpringBoot.Model.User;
8+
import com.alwinsimon.UserManagementJavaSpringBoot.Repository.UserRepository;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.security.authentication.AuthenticationManager;
11+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
12+
import org.springframework.security.core.userdetails.UsernameNotFoundException;
13+
import org.springframework.security.crypto.password.PasswordEncoder;
14+
import org.springframework.stereotype.Service;
15+
16+
@Service
17+
@RequiredArgsConstructor
18+
public class AuthenticationService {
19+
20+
private final UserRepository userRepository;
21+
private final PasswordEncoder passwordEncoder;
22+
private final JwtService jwtService;
23+
private final AuthenticationManager authenticationManager;
24+
25+
public AuthenticationResponse register(RegisterRequest request) {
26+
27+
// Build a user using builder in user model.
28+
var user = User.builder()
29+
.name(request.getName())
30+
.gender(request.getGender())
31+
.email(request.getEmail())
32+
.password(passwordEncoder.encode(request.getPassword()))
33+
.role(Role.USER)
34+
.build();
35+
36+
// Save User to DB using UserRepository
37+
userRepository.save(user);
38+
39+
// Generate a JWT Token to return along with Response.
40+
var jwtToken = jwtService.generateJwtToken(user);
41+
42+
return AuthenticationResponse.builder()
43+
.token(jwtToken)
44+
.build();
45+
46+
}
47+
48+
public AuthenticationResponse authenticate(AuthenticationRequest request) {
49+
50+
// Try Authenticating user with Authentication Manager
51+
authenticationManager.authenticate(
52+
new UsernamePasswordAuthenticationToken(
53+
request.getEmail(),
54+
request.getPassword()
55+
)
56+
);
57+
58+
/**
59+
* If the authentication manager authenticated user without throwing any exception
60+
* Find user and generate auth token
61+
* Send auth token back to user.
62+
*/
63+
64+
var user = userRepository.findByEmail(request.getEmail())
65+
.orElseThrow(() -> new UsernameNotFoundException("User not found."));
66+
67+
// Generate a JWT Token to return along with Response.
68+
var jwtToken = jwtService.generateJwtToken(user);
69+
70+
return AuthenticationResponse.builder()
71+
.token(jwtToken)
72+
.build();
73+
74+
}
75+
}

src/main/java/com/alwinsimon/UserManagementJavaSpringBoot/Service/JwtService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ private Claims extractAllClaimsFromJwtToken(String jwtToken) {
4242
.parserBuilder()
4343
.setSigningKey(getJwtSigningKey())
4444
.build()
45-
.parseClaimsJwt(jwtToken)
45+
.parseClaimsJws(jwtToken)
4646
.getBody();
4747

4848
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.alwinsimon.UserManagementJavaSpringBoot.Service;
2+
3+
import com.alwinsimon.UserManagementJavaSpringBoot.Model.User;
4+
import com.alwinsimon.UserManagementJavaSpringBoot.Repository.UserRepository;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
8+
import java.security.Principal;
9+
10+
@Service
11+
@RequiredArgsConstructor
12+
public class UserService {
13+
14+
private final UserRepository userRepository;
15+
private final Principal principal;
16+
17+
public User currentUserDetails() {
18+
String email = principal.getName();
19+
return userRepository.findByEmail(email).orElse(null);
20+
}
21+
}

0 commit comments

Comments
 (0)