SpringSecurity整合JWT的使用示例
Spring Security是一個強大的安全性框架,它提供了許多強大的功能來保護應用程序,而JWT(JSON Web Token)是一種用于在網(wǎng)絡環(huán)境中傳遞聲明的開放標準。
整合Spring Security和JWT,可以使我們的應用程序更加安全和高效。下面是整合步驟:
添加Spring Security和JWT的依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
配置Spring Security
在Spring的配置類中,我們需要設置一些安全配置,包括:
- 配置安全規(guī)則
- 配置JWT過濾器
- 配置認證管理器
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { private static final String[] AUTH_WHITELIST = { "/swagger-resources/**", "/swagger-ui.html", "/v2/api-docs", "/webjars/**" }; @Autowired private JwtFilter jwtFilter; @Autowired private UserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Override protected void configure(HttpSecurity http) throws Exception { http .cors().and().csrf().disable() .authorizeRequests() .antMatchers(AUTH_WHITELIST).permitAll() .antMatchers("/api/authenticate").permitAll() .anyRequest().authenticated() .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); } @Bean(BeanIds.AUTHENTICATION_MANAGER) public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } }
配置JWT
@Configuration public class JwtConfig { @Value("${jwt.secret}") private String secret; @Value("${jwt.expiration}") private long expiration; @Bean public JwtEncoder jwtEncoder() { return new JwtEncoder(secret, expiration); } @Bean public JwtDecoder jwtDecoder() { return new JwtDecoder(secret); } }
實現(xiàn)自定義UserDetailsService
我們需要提供一個實現(xiàn)了UserDetailsService接口的自定義類,用于從數(shù)據(jù)庫中獲取用戶信息。
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found with username: " + username); } return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"))); } }
實現(xiàn)JwtEncoder和JwtDecoder
我們需要提供一個JwtEncoder和JwtDecoder類,用于創(chuàng)建和驗證JWT。
public class JwtEncoder { private final String secret; private final long expiration; public JwtEncoder(String secret, long expiration) { this.secret = secret; this.expiration = expiration; } public String createToken(UserDetails userDetails) { Map<String, Object> claims = new HashMap<>(); claims.put("sub", userDetails.getUsername()); claims.put("iat", new Date()); claims.put("exp", new Date(System.currentTimeMillis() + expiration)); return Jwts.builder() .setClaims(claims) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } } public class JwtDecoder { private final String secret; public JwtDecoder(String secret) { this.secret = secret; } public String getUsernameFromToken(String token) { return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject(); } public boolean validateToken(String token) { try { Jwts.parser().setSigningKey(secret).parseClaimsJws(token); return true; } catch (SignatureException e) { LOGGER.error("Invalid JWT signature - {}", e.getMessage()); } catch (MalformedJwtException e) { LOGGER.error("Invalid JWT token - {}", e.getMessage()); } catch (ExpiredJwtException e) { LOGGER.error("Expired JWT token - {}", e.getMessage()); } catch (UnsupportedJwtException e) { LOGGER.error("Unsupported JWT token - {}", e.getMessage()); } catch (IllegalArgumentException e) { LOGGER.error("JWT claims string is empty - {}", e.getMessage()); } return false; } }
實現(xiàn)JWT過濾器
我們需要提供一個JwtFilter類,用于過濾JWT。
@Component public class JwtFilter extends OncePerRequestFilter { @Autowired private JwtDecoder jwtDecoder; @Autowired private UserDetailsService userDetailsService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String header = request.getHeader("Authorization"); if (StringUtils.isBlank(header) || !header.startsWith("Bearer ")) { chain.doFilter(request, response); return; } String token = header.replace("Bearer ", ""); if (jwtDecoder.validateToken(token)) { String username = jwtDecoder.getUsernameFromToken(token); UserDetails userDetails = userDetailsService.loadUserByUsername(username); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); } chain.doFilter(request, response); } }
至此,我們已經(jīng)成功地整合了Spring Security和JWT。更多相關SpringSecurity整合JWT內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringSecurity+Redis+Jwt實現(xiàn)用戶認證授權
- springboot+springsecurity+mybatis+JWT+Redis?實現(xiàn)前后端離實戰(zhàn)教程
- SpringBoot3.0+SpringSecurity6.0+JWT的實現(xiàn)
- SpringBoot整合SpringSecurity和JWT和Redis實現(xiàn)統(tǒng)一鑒權認證
- SpringBoot+SpringSecurity+jwt實現(xiàn)驗證
- SpringSecurity詳解整合JWT實現(xiàn)全過程
- mall整合SpringSecurity及JWT認證授權實戰(zhàn)下
- mall整合SpringSecurity及JWT實現(xiàn)認證授權實戰(zhàn)
- Java SpringSecurity+JWT實現(xiàn)登錄認證
- springSecurity+jwt使用小結
相關文章
java跳出循環(huán)的三種方式總結(break語句、continue語句和return語句)
在實際編程中,有時需要在條件語句匹配的時候跳出循環(huán),下面這篇文章主要給大家介紹了關于java跳出循環(huán)的三種方式,其中包括break語句、continue語句和return語句的相關資料,需要的朋友可以參考下2023-03-03idea如何debug看springsecurity的過濾器順序
這篇文章主要介紹了idea如何debug看springsecurity的過濾器順序,文中通過圖文結合的方式給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-04-04Spring Security基于JWT實現(xiàn)SSO單點登錄詳解
這篇文章主要介紹了Spring Security基于JWT實現(xiàn)SSO單點登錄詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09