返回

高屋建瓴,不动声色——Spring Boot JWT认证机制的前后端集成方案

后端

前言:

近年来,随着移动互联网的飞速发展,小程序、H5应用等新兴应用层出不穷,前后端分离的架构模式也随之成为主流。在这种架构模式下,系统认证就显得尤为重要。传统的前后端认证机制往往存在着安全隐患、易被破解、扩展性差等问题。

JWT认证机制概述:

为了解决传统认证机制的诸多弊端,JSON Web Token(JWT)应运而生。JWT是一种基于JSON标准的安全认证机制,它将用户身份信息以一种压缩、加密的方式编码成一个令牌(Token),并将其传输给客户端。客户端收到令牌后,可以将其存储在本地,并在每次请求时将其发送给服务器进行身份验证。

Spring Boot集成JWT认证:

Spring Boot是一个快速、轻便的开发框架,它提供了许多强大的功能,包括对JWT认证机制的支持。在Spring Boot中集成JWT认证,可以大大简化认证过程,提高开发效率和安全性。

1. 依赖导入:

首先,我们需要在项目中导入Spring Boot对JWT认证的支持依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2. 配置JWT:

在Spring Boot的配置文件中,我们需要配置JWT的相关参数,包括密钥、失效时间等:

# JWT密钥
jwt.secret=my-secret

# JWT失效时间(单位:分钟)
jwt.expiration=30

3. 创建JWT:

在需要生成JWT的地方,我们可以使用JJWT提供的工具类来创建JWT:

String token = Jwts.builder()
    .setSubject(username)
    .setExpiration(new Date(System.currentTimeMillis() + jwt.expiration * 60 * 1000))
    .signWith(SignatureAlgorithm.HS512, jwt.secret)
    .compact();

4. 验证JWT:

在需要验证JWT的地方,我们可以使用JJWT提供的工具类来验证JWT:

try {
    Jwts.parser()
        .setSigningKey(jwt.secret)
        .parseClaimsJws(token);
    return true;
} catch (Exception e) {
    return false;
}

5. 前后端集成:

在前后端分离的架构模式下,我们需要在前后端分别集成JWT认证:

前端:

在前端,我们需要在请求头中携带JWT令牌,以便服务器进行身份验证:

axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

后端:

在后端,我们需要在请求拦截器中对JWT令牌进行验证:

@Configuration
public class JwtFilter extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/login");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
            .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

    private static class JwtAuthenticationFilter extends OncePerRequestFilter {

        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            String token = request.getHeader("Authorization");
            if (token != null && token.startsWith("Bearer ")) {
                token = token.substring(7);
                try {
                    Jwts.parser()
                        .setSigningKey(jwt.secret)
                        .parseClaimsJws(token);
                } catch (Exception e) {
                    response.setStatus(401);
                    return;
                }
            } else {
                response.setStatus(401);
                return;
            }
            filterChain.doFilter(request, response);
        }
    }
}

结语:

Spring Boot集成JWT认证,可以大大简化认证过程,提高开发效率和安全性。通过本文的讲解,读者已经能够从全局的视角深刻理解并轻松构建前后端分离架构下的认证机制,提升开发效率和安全性。