返回
高手指点迷津:四步速成 SpringSecurity+JWT 登陆认证!
后端
2023-12-18 11:50:56
- 前戏:认识 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 登录认证玩得风生水起。小二的代码就像一条闪闪发光的丝带,在系统间翩翩起舞,令牌在其中穿梭自如,验证顺畅无阻。
学长我欣慰地拍拍小二的肩膀,孺子可教也!