返回

高手指点迷津:四步速成 SpringSecurity+JWT 登陆认证!

后端

  1. 前戏:认识 SpringSecurity 与 JWT

若要理解 SpringSecurity + JWT 的强大之处,就得先搞清楚它们各自的拿手戏。

SpringSecurity

SpringSecurity 是 Java 领域一道不可或缺的安全大餐,为应用系统撑起一道钢筋铁骨,把那些试图偷窥、破坏你系统的小贼们统统挡在门外,让你的应用安全无忧。SpringSecurity,是兄弟,就得够义气,它提供了多种认证方式,包括表单认证、JWT 认证等等。

JWT

JWT 全称 JSON Web Token,听起来高大上,其实就是一种身份凭证,就像你出门必备的身份。它将用户身份信息压缩成一块小小的令牌,方便在系统间传递,免去反复验证的麻烦。

2. 正戏:四步搞定登录认证

话不多说,登场吧,让你瞧瞧小二如何靠这四招征服实习生。

第一步:导入依赖

小二首先祭出 SpringSecurity 和 JWT 两大法宝,加入项目依赖,就像是备齐了做饭的食材,就等着大展厨艺。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

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

第二步:配置 SpringSecurity

小二紧接着对 SpringSecurity 进行了一番悉心调教,设置好安全配置,就像给房子装上防盗门,保障应用的安全。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin().disable()
                .csrf().disable()
                .addFilter(new JWTAuthenticationFilter(authenticationManager()))
                .addFilter(new JWTAuthorizationFilter(authenticationManager()));
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

第三步:创建 JWT 工具类

小二利用 jjwt 这款工具箱,打造了 JWT 工具类,就像拥有了秘制调料,让令牌生成更方便。

public class JWTUtil {

    private static final String SECRET = "your-secret";

    public static String generateToken(String username) {
        Date now = new Date();
        Date expireDate = new Date(now.getTime() + 3600000); // 有效期设为1小时

        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(now)
                .setExpiration(expireDate)
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();
    }

    public static String getUsernameFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    public static boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
            return true;
        } catch (SignatureException | ExpiredJwtException e) {
            return false;
        }
    }
}

第四步:编写控制器

小二挥舞代码利剑,撰写了控制器,就像烹制美味佳肴,让系统拥有了处理登录和验证令牌的能力。

@RestController
public class AuthController {

    @PostMapping("/login")
    public String login(@RequestBody LoginRequest loginRequest) {
        if ("user".equals(loginRequest.getUsername()) && "password".equals(loginRequest.getPassword())) {
            String token = JWTUtil.generateToken(loginRequest.getUsername());
            return token;
        } else {
            throw new RuntimeException("用户名或密码错误");
        }
    }

    @GetMapping("/verify")
    public boolean verify(@RequestHeader("Authorization") String token) {
        return JWTUtil.validateToken(token.substring(7));
    }
}

3. 尾声:实习生凯旋

小二初出茅庐,却靠着这四招把 SpringSecurity + JWT 登录认证玩得风生水起。小二的代码就像一条闪闪发光的丝带,在系统间翩翩起舞,令牌在其中穿梭自如,验证顺畅无阻。

学长我欣慰地拍拍小二的肩膀,孺子可教也!