0% found this document useful (0 votes)
11 views

JWT Implementation in SpringBoot Using SQL DB

Jwt

Uploaded by

gsndharavkatyal
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views

JWT Implementation in SpringBoot Using SQL DB

Jwt

Uploaded by

gsndharavkatyal
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

How to Implement

JWT Authentication
& Authorization
using SQL
sahu-himanshu
jwt.txt

1
2
What is ‘JWT’? {
3
4 JWT stands for JSON Web Token. It is an
5 open standard (RFC 7519) used for securely
6
transmitting information between parties as
7
8
a JSON object. This information can be
9 verified and trusted because it is
10 digitally signed.
11
12 }
13
14

Java (Spring Boot) sahu-himanshu


steps.txt

1
2
Steps to ‘Implement’ {
3
Write the Entity classes
4 01 for User and Role
5
6 02 Setup SQL & Create Role/User Repo
7
Create Controller and Services
8 03 for User and Roles
9
10
11 04 Create Security Configuration Files
12
13
14 }
Java (Spring Boot) sahu-himanshu
steps.txt

1
2
Steps to ‘Implement’ {
3
4 05 Implement UserDetailsService
5
Implement AuthenticationEntryPoint and
6 06 AuthenticationFilter
7
8
Create JWT Classes: JWTResponse,
9 07 JWTRequest, JWTHelper
10
11
12 }
13
14

Java (Spring Boot) sahu-himanshu


User.java Role.java

1
2
User ‘Class’;
@Getter
3 @Setter
@AllArgsConstructor
4 @Entity
@Table(name = "users")
5 public class User implements UserDetails {
6 @Id
@Column(name = "id")
7 private String userId;
private String name;
8 private String email;
9 private String password;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
10 @JoinTable(name = "employee_roles",
joinColumns = @JoinColumn(name = "employee_id", referencedColumnName = "id"),
11 inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName =
"id")
12 )
13 @JsonManagedReference
private List<Role> roles;
14 }

Java (Spring Boot) sahu-himanshu


User.java Role.java

1
2
Role ‘Class’;
3
@Getter
4 @Setter
@AllArgsConstructor
5 @Entity
6 @Table(name = "role")
public class Role {
7 @Id
@Column(name = "id")
8 private String roleId;
9
private String name;
10
@ManyToMany(mappedBy = "roles")
11 @JsonBackReference
private List<User> users;
12 }
13
14

Java (Spring Boot) sahu-himanshu


UserRepository.java RoleRepository.java

1
2
User & RoleRepository ‘Class’;
3
4
# UserRepository.java
5 @Repository
6 public interface UserRepository extends JpaRepository<User, String> {
Optional<User> findByEmail(String email);
7 }

8 # RoleRepository.java
9 @Repository
public interface RoleRepository extends JpaRepository<Role, String> {
10 Optional<Role> findById(String id);
}
11
12
13
14

Java (Spring Boot) sahu-himanshu


AdminController.java AuthController.java

1
2
AdminController ‘Class’;
3
4
@RestController
5 @RequestMapping("/admin")
6 public class AdminController {

7 @Autowired
private UserService userService;
8
9 @PostMapping("/create")
public String user(@RequestBody User user) {
10 return userService.createUser(user);
}
11 }
12
13
14

Java (Spring Boot) sahu-himanshu


AdminController.java AuthController.java

1
2
AuthController ‘Class’;
@RestController

3 @RequestMapping("/auth")
public class AuthController {

4 @Autowired
private UserDetailsService userDetailsService;

5 @Autowired
private AuthenticationManager manager;
private void doAuthenticate(String email, String password) {

@Autowired UsernamePasswordAuthenticationToken authentication = new


6 private JwtHelper helper; UsernamePasswordAuthenticationToken(email, password);
try {
7 private Logger logger =
LoggerFactory.getLogger(AuthController.class);
manager.authenticate(authentication);

8 @PostMapping("/login") } catch (BadCredentialsException e) {


public ResponseEntity<JwtResponse> login(@RequestBody JwtRequest throw new BadCredentialsException(" Invalid Username or
9 request) { Password !!");
}
this.doAuthenticate(request.getEmail(),
10 request.getPassword()); }
UserDetails userDetails =
11 userDetailsService.loadUserByUsername(request.getEmail());
String token = this.helper.generateToken(userDetails);
@ExceptionHandler(BadCredentialsException.class)
public String exceptionHandler() {
JwtResponse response = JwtResponse.builder()
12 .jwtToken(token) }
return "Credentials Invalid !!";

.username(userDetails.getUsername())
13 .build();
return new ResponseEntity<>(response, HttpStatus.OK);
}

}
14

Java (Spring Boot) sahu-himanshu


UserController.java

1
2
UserController ‘Class’;
3 @RestController
4 @RequestMapping("/user")
public class UserController {
5
@Autowired
6 private UserService userService;
7 @RequestMapping("/getevents")
8 private String getEvents() {
return "Events";
9 }
10 @GetMapping("/all")
11 public List<User> user() {
return this.userService.getAllUsers();
12 }
}
13
14

Java (Spring Boot) sahu-himanshu


AuthController.java UserService.java

1 UserService ‘Class’;
2
3 public String createUser(User user) {

4 @Service user.setUserId(UUID.randomUUID().toString());
public class UserService {
5 user.setPassword(passwordEncoder.encode(user.get
@Autowired
6 private UserRepository userRepository;
Password()));

7 @Autowired
List<Role> roles = user.getRoles();
for (Role role: roles) {
8 private RoleRepository roleRepository; Role r = new Role();
9 @Autowired r.setRoleId(UUID.randomUUID().toString());
private PasswordEncoder passwordEncoder;
10 r.setName(role.getName());
// roleRepository.save(r);
11 public List<User> getAllUsers() { }
return userRepository.findAll(); userRepository.save(user);
12 } return user.getUserId();
}
13
14 }

Java (Spring Boot) sahu-himanshu


AppConfig.java SecurityConfig.java

1
2
AppConfig ‘Class’;
3
4
5
6 @Configuration
public class AppConfig {
7
8 @Bean
public PasswordEncoder passwordEncoder() {
9 return new BCryptPasswordEncoder();
}
10 }
11
12
13
14

Java (Spring Boot) sahu-himanshu


AppConfig.java Security.java

1 SecurityConfig ‘Class’;
2 @Configuration
public class SecurityConfig {

3 @Autowired
private JWTAuthentcationEntryPoint point;
4 @Autowired
private JwtAuthenticationFilter filter;

5 @Autowired
private CustomUserDetailsService userDetailsService; @Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
6 @Autowired
private PasswordEncoder passwordEncoder;
DaoAuthenticationProvider daoAuthenticationProvider = new
DaoAuthenticationProvider();
7 @Bean daoAuthenticationProvider.setUserDetailsService(userDetailsService);
public SecurityFilterChain securityFilterChain(HttpSecurity
8 http) throws Exception { daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
http.csrf(csrf -> csrf.disable()) return daoAuthenticationProvider;
9 .authorizeHttpRequests(auth -> auth
.requestMatchers("/auth/login").permitAll()
}

10 .requestMatchers("/admin/create").permitAll()
@Bean
public AuthenticationManager
authenticationManager(AuthenticationConfiguration configuration)
11 .requestMatchers("/user/all").hasAuthority("USER")
.anyRequest().hasAnyAuthority("ADMIN",
throws Exception {
return configuration.getAuthenticationManager();
"USER"))
12 .exceptionHandling(ex -> }
}

ex.authenticationEntryPoint(point))
13 .sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
http.addFilterBefore(filter,
14 UsernamePasswordAuthenticationFilter.class);
return http.build();
}

Java (Spring Boot) sahu-himanshu


CustomUserDetailsService.java UserService.java

1
2
UserDetailsService ‘Class’;
3
4 @Service
public class CustomUserDetailsService implements UserDetailsService {
5
6 @Autowired
private UserRepository userRepository;
7
@Override
8 public UserDetails loadUserByUsername(String username) throws
9 UsernameNotFoundException {
User user = userRepository.findByEmail(username).orElseThrow(() -> new
10 RuntimeException("User Not found!"));
return user;
11 }
}
12
13
14

Java (Spring Boot) sahu-himanshu


JWTAuthenticationEntryPoint.java AuthenticationFilter.java

1 JWTAuthenticationEntryPoint ‘Class’;
2
3
4
5 @Component
6 public class JWTAuthentcationEntryPoint implements AuthenticationEntryPoint {
@Override
7 public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
8 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
9 PrintWriter printWriter = response.getWriter();
printWriter.println("Access Denied!!!" + authException.getMessage());
10 }
}
11
12
13
14

Java (Spring Boot) sahu-himanshu


JWTAuthenticationEntryPoint.java JWTAuthenticationFilter.java

1 JWTAuthenticationFilter ‘Class’;
2 @Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
3 private Logger logger =
LoggerFactory.getLogger(OncePerRequestFilter.class); if (username != null && SecurityContextHolder.getContext().getAuthentication()
4 @Autowired
private JwtHelper jwtHelper;
== null) {

@Autowired UserDetails userDetails =


5 private UserDetailsService userDetailsService;
@Override
this.userDetailsService.loadUserByUsername(username);
Boolean validateToken = this.jwtHelper.validateToken(token,
protected void doFilterInternal(HttpServletRequest request, userDetails);
6 HttpServletResponse response, FilterChain filterChain) throws ServletException,
IOException {
if (validateToken) {

String requestHeader = request.getHeader("Authorization"); UsernamePasswordAuthenticationToken authentication = new


7 logger.info(" Header : {}", requestHeader);
String username = null;
UsernamePasswordAuthenticationToken(userDetails, null,
userDetails.getAuthorities());

8
String token = null; authentication.setDetails(new
if (requestHeader != null && requestHeader.startsWith("Bearer")) { WebAuthenticationDetailsSource().buildDetails(request));
token = requestHeader.substring(7);

9 try {
username = this.jwtHelper.getUsernameFromToken(token); SecurityContextHolder.getContext().setAuthentication(authentication);
} catch (IllegalArgumentException e) {

10 logger.info("Illegal Argument while fetching the username !!");


e.printStackTrace(); } else {
} catch (ExpiredJwtException e) { logger.info("Validation fails !!");

11 logger.info("Given jwt token is expired !!");


e.printStackTrace();
}

} catch (MalformedJwtException e) {
12 logger.info("Some changed has done in token !! Invalid Token");
e.printStackTrace();
}

} catch (Exception e) { filterChain.doFilter(request, response);


13 }
e.printStackTrace();

else { }
14 }
logger.info("Invalid Header Value !! "); }

Java (Spring Boot) sahu-himanshu


JWTResponse.java JWTRequest.java

1 JWTResponse ‘Class’;
2
3
4
5
@Getter
6 @Setter
@AllArgsConstructor
7 @Builder
8 public class JwtResponse {

9 private String jwtToken;


private String username;
10 }
11
12
13
14

Java (Spring Boot) sahu-himanshu


JWTResponse.java JWTRequest.java

1 JWTRequest ‘Class’;
2
3
4
5 @Getter
@Setter
6 @NoArgsConstructor
7 @AllArgsConstructor
8 @Builder
@ToString
9 public class JwtRequest {
10 private String email;
11 private String password;
}
12
13
14

Java (Spring Boot) sahu-himanshu


JWTHelper.java

1 JWTHelper ‘Class’;
2 @Component
public class JwtHelper {
3 public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; public String generateToken(UserDetails userDetails) {
private String secret = Map<String, Object> claims = new HashMap<>();
4 "afafasfafafasfasfasfafacasdasfasxASFACASDFACASDFASFASFDAFASFASDAAD return doGenerateToken(claims, userDetails.getUsername());
SCSDFADCVSGCFVADXCcadwavfsfarvf"; }
5 private String doGenerateToken(Map<String, Object> claims, String subject) {
public String getUsernameFromToken(String token) {
6 return getClaimFromToken(token, Claims::getSubject); return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new
Date(System.currentTimeMillis()))
}
7 public Date getExpirationDateFromToken(String token) {
return getClaimFromToken(token, Claims::getExpiration);
.setExpiration(new Date(System.currentTimeMillis() +
JWT_TOKEN_VALIDITY * 1000))
.signWith(SignatureAlgorithm.HS512, secret).compact();
8 }
public <T> T getClaimFromToken(String token, Function<Claims, }
T> claimsResolver) { public Boolean validateToken(String token, UserDetails userDetails) {
9 final Claims claims = getAllClaimsFromToken(token); final String username = getUsernameFromToken(token);
return claimsResolver.apply(claims); return (username.equals(userDetails.getUsername()) &&
10 } !isTokenExpired(token));
private Claims getAllClaimsFromToken(String token) { }
11 return }
Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody()
12 ;
}
13 private Boolean isTokenExpired(String token) {
final Date expiration = getExpirationDateFromToken(token);
14 }
return expiration.before(new Date());

Java (Spring Boot) sahu-himanshu


1
2
3
4
5
Thanks {
Guys;
6
7
8
9
10
11
12
13
14
}
Programming Language sahu-himanshu

You might also like