Skip to content

Commit f3b19e7

Browse files
committed
Implementing JWT : Added JWt Token Generation code
1 parent 798df5c commit f3b19e7

7 files changed

Lines changed: 116 additions & 25 deletions

File tree

Projects/spring-security-demo/pom.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,24 @@
7070
<artifactId>spring-boot-starter-webmvc-test</artifactId>
7171
<scope>test</scope>
7272
</dependency>
73+
<dependency>
74+
<groupId>io.jsonwebtoken</groupId>
75+
<artifactId>jjwt-impl</artifactId>
76+
<version>0.13.0</version>
77+
<scope>runtime</scope>
78+
</dependency>
79+
<dependency>
80+
<groupId>io.jsonwebtoken</groupId>
81+
<artifactId>jjwt-api</artifactId>
82+
<version>0.13.0</version>
83+
<scope>compile</scope>
84+
</dependency>
85+
<dependency>
86+
<groupId>io.jsonwebtoken</groupId>
87+
<artifactId>jjwt-jackson</artifactId>
88+
<version>0.13.0</version>
89+
<scope>runtime</scope>
90+
</dependency>
7391
</dependencies>
7492

7593
<build>

Projects/spring-security-demo/src/main/java/com/dj/spring_security_demo/config/SecurityConfig.java

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@
44
import org.springframework.beans.factory.annotation.Autowired;
55
import org.springframework.context.annotation.Bean;
66
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.security.authentication.AuthenticationManager;
78
import org.springframework.security.authentication.AuthenticationProvider;
89
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
910
import org.springframework.security.config.Customizer;
11+
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
1012
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1113
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
1214
import org.springframework.security.config.http.SessionCreationPolicy;
1315
import org.springframework.security.core.userdetails.UserDetailsService;
1416
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
15-
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
1617
import org.springframework.security.web.SecurityFilterChain;
1718

1819
@Configuration
@@ -36,32 +37,19 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http){
3637
//using a builder pattern
3738
http
3839
.csrf(customizer -> customizer.disable())
39-
.authorizeHttpRequests(request -> request.anyRequest().authenticated())
40+
.authorizeHttpRequests(request -> request
41+
.requestMatchers("/register","/login")
42+
.permitAll()
43+
.anyRequest().authenticated())
4044
.httpBasic(Customizer.withDefaults())
4145
.sessionManagement(session ->
4246
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
4347

4448
return http.build();
4549
}
4650

47-
//creating new user name and passwrod
48-
// @Bean
49-
// public UserDetailsService userDetailsService (){
50-
// UserDetails user = User
51-
// .withDefaultPasswordEncoder()
52-
// .username("dj")
53-
// .password("123")
54-
// .roles("USER")
55-
// .build();
56-
57-
// UserDetails user1 = User
58-
// .withDefaultPasswordEncoder()
59-
// .username("admin")
60-
// .password("123")
61-
// .roles("ADMIN")
62-
// .build();
63-
64-
// return new InMemoryUserDetailsManager(user,user1);
65-
// }
66-
51+
@Bean
52+
public AuthenticationManager authenticationManager(AuthenticationConfiguration config){
53+
return config.getAuthenticationManager();
54+
}
6755
}

Projects/spring-security-demo/src/main/java/com/dj/spring_security_demo/controller/HelloController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
public class HelloController {
1010

1111
@GetMapping("hello")
12-
public String greet(HttpServletRequest request){
13-
return "Hello World!" + request.getSession().getId();
12+
public String greet(){
13+
return "Hello World!";
1414
}
1515

1616
@GetMapping("about")
Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.dj.spring_security_demo.controller;
22

33
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.security.authentication.AuthenticationManager;
5+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
6+
import org.springframework.security.core.Authentication;
47
import org.springframework.web.bind.annotation.PostMapping;
58
import org.springframework.web.bind.annotation.RequestBody;
69
import org.springframework.web.bind.annotation.RestController;
710

811
import com.dj.spring_security_demo.model.User;
12+
import com.dj.spring_security_demo.service.JwtService;
913
import com.dj.spring_security_demo.service.UserService;
1014

1115
@RestController
@@ -14,8 +18,25 @@ public class UserController {
1418
@Autowired
1519
UserService userService;
1620

17-
@PostMapping("user")
21+
@Autowired
22+
AuthenticationManager authenticationManager;
23+
24+
@Autowired
25+
private JwtService jwtService;
26+
27+
@PostMapping("register")
1828
public User register(@RequestBody User user){
1929
return userService.saveUser(user);
2030
}
31+
32+
@PostMapping("login")
33+
public String login(@RequestBody User user){
34+
35+
Authentication authentication = authenticationManager
36+
.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()));
37+
38+
if(authentication.isAuthenticated())
39+
return jwtService.generateToken(user.getUsername());
40+
return "Failed";
41+
}
2142
}

Projects/spring-security-demo/src/main/java/com/dj/spring_security_demo/model/User.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.dj.spring_security_demo.model;
22

3+
import jakarta.annotation.Generated;
34
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
47
import jakarta.persistence.Id;
58
import jakarta.persistence.Table;
69
import lombok.Data;
@@ -10,6 +13,7 @@
1013
@Table(name = "users")
1114
public class User {
1215
@Id
16+
@GeneratedValue(strategy = GenerationType.IDENTITY)
1317
private int id;
1418
private String username;
1519
private String password;
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.dj.spring_security_demo.service;
2+
3+
import java.security.Key;
4+
import java.security.NoSuchAlgorithmException;
5+
import java.sql.Date;
6+
import java.util.Base64;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
import javax.crypto.KeyGenerator;
11+
import javax.crypto.SecretKey;
12+
13+
import org.springframework.stereotype.Service;
14+
15+
import io.jsonwebtoken.Jwts;
16+
import io.jsonwebtoken.SignatureAlgorithm;
17+
import io.jsonwebtoken.io.Decoders;
18+
import io.jsonwebtoken.security.Keys;
19+
20+
@Service
21+
public class JwtService {
22+
23+
private static final String SECRET = "TmV3U2VjcmV0S2V5Rm9ySldUU2lnbmluZ1B1cnBvc2VzMTIzNDU2Nzg=\r\n";
24+
25+
private String secretKey;
26+
27+
public JwtService(){
28+
secretKey = generateSecretKey();
29+
}
30+
31+
public String generateSecretKey() {
32+
try {
33+
KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA256");
34+
SecretKey secretKey = keyGen.generateKey();
35+
System.out.println("Secret Key : " + secretKey.toString());
36+
return Base64.getEncoder().encodeToString(secretKey.getEncoded());
37+
} catch (NoSuchAlgorithmException e) {
38+
throw new RuntimeException("Error generating secret key", e);
39+
}
40+
}
41+
42+
public String generateToken(String username) {
43+
Map<String,Object> claims = new HashMap<>();
44+
45+
return Jwts.builder()
46+
.setClaims(claims)
47+
.setSubject(username)
48+
.setIssuedAt(new Date(System.currentTimeMillis()))
49+
.setExpiration(new Date(System.currentTimeMillis()+1000*60*3))
50+
.signWith(getKey(),SignatureAlgorithm.HS256).compact();
51+
}
52+
53+
private Key getKey(){
54+
byte[] keyBytes = Decoders.BASE64.decode(secretKey);
55+
return Keys.hmacShaKeyFor(keyBytes);
56+
}
57+
58+
}

Projects/spring-security-demo/src/main/resources/application.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ spring.datasource.username = neondb_owner
99
spring.datasource.password = npg_XIunGO9rF4DA
1010
spring.datasource.driver-class-name=org.postgresql.Driver
1111

12+
spring.jpa.show-sql=true
13+
spring.jpa.hibernate.ddl-auto=update

0 commit comments

Comments
 (0)