springsecurity和jwt
时间: 2025-02-03 08:11:36 浏览: 34
### 如何在 Spring Security 中使用 JWT 实现认证与授权
#### 用户类设计
为了使用户能够被 Spring Security 认证,用户实体应当实现 `UserDetails` 接口。这允许自定义加载用户的权限逻辑以及提供必要的安全细节[^1]。
```java
public class MyUserDetail implements UserDetails {
private User user;
public MyUserDetail(User user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> authorities = new ArrayList<>();
// 假设用户有一个角色列表
for (Role role : user.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return authorities;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
// ...其他方法省略...
}
```
#### 登录令牌处理
创建登录请求的数据传输对象(DTO),用于接收前端发送过来的用户名和密码,并返回给客户端一个包含有效载荷的 JSON Web Token(JWT)。这里展示了一个简单的 `LoginToken` 类来表示这个概念[^4]:
```java
@Data
@ToString
public class LoginToken {
@NotNull
private String name;
private String token;
}
```
#### 配置过滤器链
为了让 Spring Security 支持 JWT,在配置中需添加特定于应用程序的安全性设置。通常情况下,这是通过扩展 `WebSecurityConfigurerAdapter` 来完成的。不过需要注意的是,从 Spring Security 5 开始推荐直接注册 Bean 的方式而不是继承该适配器类。下面是一个简化版的例子说明如何配置 HTTP 请求的安全策略并加入 JWT 解析功能:
```java
@EnableWebSecurity
public class SecurityConfig {
@Autowired
private JwtAuthenticationEntryPoint unauthorizedHandler;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable().
authorizeRequests()
.antMatchers("/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public JwtRequestFilter jwtRequestFilter() {
return new JwtRequestFilter(userDetailsService(), null); // 这里的null应该是jwtUtil实例
}
// 更多bean定义...
}
```
在这个例子中,`JwtRequestFilter` 是用来解析来自HTTP头中的token并将它转换成Spring Security上下文中可用的身份信息的一个定制化过滤器。当接收到受保护资源的访问尝试时,此过滤器会拦截这些请求并对携带的有效凭证进行验证。
#### 处理异常情况
如果在认证或授权过程中出现问题,则会被 `ExceptionTranslationFilter` 捕捉到。该组件负责区分是由于缺少有效的身份证明引起的认证错误还是因为当前主体缺乏执行某些操作所需的权利而导致的授权失败[^3]。
阅读全文
相关推荐


















