- JWT
- Tạo file JwtRespone như sau:
- JwtService
@Service
public class JwtService {
private static final String SECRET_KEY = "11111111111111111111111111111111";
private static final long EXPIRE_TIME = 86400000000L;
private static final Logger logger = LoggerFactory.getLogger(JwtService.class.getName());
public String generateTokenLogin(Authentication authentication) {
UserPrinciple userPrincipal = (UserPrinciple) authentication.getPrincipal();
return Jwts.builder()
.setSubject((userPrincipal.getUsername()))
.setIssuedAt(new Date())
.setExpiration(new Date((new Date()).getTime() + EXPIRE_TIME * 1000))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
public boolean validateJwtToken(String authToken) {
try {
Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(authToken);
return true;
} catch (SignatureException e) {
logger.error("Invalid JWT signature -> Message: {} ", e);
} catch (MalformedJwtException e) {
logger.error("Invalid JWT token -> Message: {}", e);
} catch (ExpiredJwtException e) {
logger.error("Expired JWT token -> Message: {}", e);
} catch (UnsupportedJwtException e) {
logger.error("Unsupported JWT token -> Message: {}", e);
} catch (IllegalArgumentException e) {
logger.error("JWT claims string is empty -> Message: {}", e);
}
return false;
}
public String getUserNameFromJwtToken(String token) {
String userName = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody().getSubject();
return userName;
}
}
- Cấu hình và phân quyền:
- JwtAuthenticationFilter:
- SecurityConfig:
- @Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
@Autowired
private UserService userService;
@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter();
}
@Bean(BeanIds.AUTHENTICATION_MANAGER)
@Override
public AuthenticationManager authenticationManager() throws Exception {
return super.authenticationManager();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(10);
}
@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/**");
http.authorizeRequests()
.antMatchers("/",
"/login").permitAll()
.anyRequest().authenticated()
.and().csrf().disable()
.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.cors();
}
}
- Tạo controller
- Chạy thử:
- Khi ứng dụng được chạy chúng ta bật postman lên rồi gửi request tới địa chỉ http://localhost:8080/login
- Sau đó chúng ta nhấn send để lấy về mã jwt
- Để truy cập được những trang web có bảo mật chúng ta cần copy đoạn access token trả về và làm như trong ảnh
- Và sau đó ấn nút send để gửi lại request sau khi được thêm mã token
Link phần 1: https://blog.codegym.vn/2020/02/20/huong-dan-ve-spring-security-va-jwt-phan-1/
1 comments On Hướng dẫn về Spring Security và JWT Phần 2
Great content! Super high-quality! Keep it up! 🙂