Springboot+Spring-Security+JWT 实现用户登录和权限认证

1. 环境准备

  • 安装 JDK:确保你的开发环境中安装了 JDK 8 及以上版本。
  • 创建 Spring Boot 项目:可以使用 Spring Initializr(https://start.spring.io/)创建一个新的Spring Boot 项目,添加以下依赖:
    • Spring Web
    • Spring Security
    • Spring Data JPA(如果使用数据库)
    • JWT(可以通过 Maven 或 Gradle 手动添加)

2. 项目结构

你的项目结构大致可以是这样的:

src/main/java/com/example/demo
│
├── config
│   ├── SecurityConfig.java
│   └── WebSecurityConfig.java
├── controller
│   └── AuthController.java
├── model
│   ├── User.java
│   └── Role.java
├── repository
│   └── UserRepository.java
├── service
│   ├── UserService.java
│   └── JwtService.java
└── DemoApplication.java

3. 用户模型

首先定义用户模型,例如 User 类:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String username;
    private String password;
    
    // 其他属性和 getter/setter
}

4. JWT 工具类

创建一个 JWT 工具类,用于生成和解析 JWT:

@Component
public class JwtService {
    private final String SECRET_KEY = "your_secret_key"; // 请使用更复杂的密钥

    public String generateToken(UserDetails userDetails) {
        return Jwts.builder()
                .setSubject(userDetails.getUsername())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10小时过期
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public String extractUsername(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
    }

    public boolean isTokenExpired(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration().before(new Date());
    }
}

5. 安全配置

创建安全配置类,配置 Spring Security:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/auth/login").permitAll()
            .anyRequest().authenticated()
            .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        
        http.addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}

6. 认证控制器

创建认证控制器,处理用户登录请求:

@RestController
@RequestMapping("/auth")
public class AuthController {
    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtService jwtService;

    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestBody AuthRequest request) {
        authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())
        );
        String token = jwtService.generateToken(userDetails);
        return ResponseEntity.ok(token);
    }
}

7. 用户认证和授权

实现用户认证的逻辑,以及如何从 JWT 中提取用户信息,进行权限校验。

8.架构

以下是这种架构的流程和整体图解:

+-----------------------+      +-----------------------+ 
|    Client (Frontend)   |      |      Database         |
+-----------------------+      +-----------------------+
           |                              |
           v                              v
+-----------------------+      +-----------------------+  
|  Authentication API    |<--> |  User/Role Repository  |
|  (Login/Register)      |      |                       |
+-----------------------+      +-----------------------+
           |
           v
+-----------------------+
| JWT Generation Module |
|  - Sign JWT           |
|  - Validate JWT       |
+-----------------------+
           |
           v
+-----------------------+      +-----------------------+
|  JWT Filter Middleware|----->|  Business Logic Layer  | (Secured Endpoints)
+-----------------------+      +-----------------------+
           |
           v
+-----------------------+
|  Spring Security      | 
|  - Role/Permission    |
|  - User Authentication|
+-----------------------+
           |
           v
+-----------------------+
|  HTTP Response (Token/|
|  Authenticated Data)  |
+-----------------------+
           |
           v
+-----------------------+
|      Client (Frontend)|
+-----------------------+
各个模块的功能解释
8.1. 客户端(Client)
  • 用户通过前端(例如 Web、移动端应用)发起登录请求,将用户名和密码提交给后端 API。
  • 登录成功后,后端返回一个 JWT 令牌,前端将令牌保存在本地存储或 cookies 中,后续请求会携带这个令牌。
8.2. 认证控制器(Authentication Controller)
  • 负责处理用户登录和注册请求。
  • 接收用户的用户名和密码,并调用 AuthenticationManager 进行认证。
  • 认证成功后,生成 JWT 令牌,并将其返回给客户端。
8.3. JWT 管理模块
  • 生成 JWT:一旦用户认证成功,系统会生成一个 JWT,通常包含用户的用户名、角色、令牌过期时间等信息。
  • 解析 JWT:每个用户请求时携带的 JWT 会通过过滤器解析出用户身份。
  • 验证 JWT:检查令牌的有效性、过期时间,并确保签名没有被篡改。
8.4. JWT 过滤器(JWT Filter)
  • JWT 过滤器会拦截所有请求,从 HTTP 请求头中获取 JWT 令牌。
  • 验证令牌的有效性,解析出用户的身份信息。
  • 将解析后的用户信息添加到 SecurityContextHolder 中,让 Spring Security 知道当前用户是谁,拥有什么权限。
8.5. Spring Security
  • 处理用户的认证和授权,控制用户访问系统中的受保护资源。
  • 基于 SecurityContextHolder 中的用户信息决定用户能访问哪些资源(控制角色、权限)。
  • 通过注解(如 @PreAuthorize)或配置类定义权限。
8.6. 数据库模块
  • 存储用户、角色、权限等信息,供认证和权限管理使用。
  • 使用 Spring Data JPA 或其他 ORM 工具来访问用户表和角色表。
8.7. 业务逻辑层(Business Logic Layer)
  • 承载系统的核心业务逻辑。
  • 所有请求都会经过 Spring Security 认证和授权,确保只有合适权限的用户才能执行特定操作。

9. 测试

使用 Postman 或类似工具测试你的 API。确保能成功登录并返回 JWT,之后可以使用该 JWT 进行授权访问其他受保护的资源。

10. 深入学习

  • 学习 Spring Security 的更多配置选项,如角色和权限控制。
  • 深入了解 JWT 的工作原理和安全性。
  • 了解如何将用户信息存储在数据库中,并与 Spring Data JPA 集成。

11. 进一步扩展

  • 添加用户注册功能。
  • 处理 JWT 的刷新和注销。
  • 研究 OAuth2 和 Spring Security 的其他身份验证机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuwinter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值