Java给项目增加token权限

引言

在现代的软件开发中,安全性是非常重要的一项考虑因素。为了保护用户的信息和系统资源,我们需要对项目进行身份验证和授权。其中一种常见的方式是使用token权限来实现。本文将教你如何在Java项目中增加token权限。

整体流程

下面是实现Java项目增加token权限的整体流程:

步骤 描述
1 用户登录,并获取token
2 在每个请求中,验证token的有效性
3 根据token中的信息进行权限控制

接下来,我们将逐步解释每个步骤需要做什么,以及相关的代码。

用户登录并获取token

首先,用户需要提供用户名和密码进行登录。在验证用户名和密码成功后,服务器将生成一个token,并返回给用户。这个token将在后续的请求中被用于身份验证。

// 用户登录的接口
@PostMapping("/login")
public String login(@RequestBody LoginRequest request) {
    // 验证用户名和密码
    if (authenticate(request.getUsername(), request.getPassword())) {
        // 生成token,使用JWT库
        String token = JwtUtils.generateToken(request.getUsername(), expirationTime);
        return token;
    } else {
        // 登录失败
        throw new IllegalArgumentException("Invalid username or password");
    }
}

在上面的代码中,我们使用了一个authenticate方法来验证用户名和密码的正确性。如果验证成功,我们调用generateToken方法生成一个token,并将其返回给用户。

验证token的有效性

在每个请求中,我们需要验证token的有效性,以确保用户是经过身份验证的。

// 验证token的过滤器
public class JwtTokenFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // 从请求头中获取token
        String token = extractToken(request.getHeader("Authorization"));

        // 验证token的有效性
        if (JwtUtils.validateToken(token)) {
            // 将token中的用户信息存储在SecurityContext中
            Authentication authentication = JwtUtils.getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(authentication);
            filterChain.doFilter(request, response);
        } else {
            // token无效,返回错误信息
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid token");
        }
    }

    // 从请求头中提取token
    private String extractToken(String header) {
        // 格式为 "Bearer token"
        if (StringUtils.hasText(header) && header.startsWith("Bearer ")) {
            return header.substring(7);
        } else {
            return null;
        }
    }
}

在上面的代码中,我们创建了一个过滤器JwtTokenFilter,它会拦截每个请求,并从请求头中提取token。然后,我们调用validateToken方法验证token的有效性。如果token有效,我们将提取出的用户信息存储在SecurityContext中,以便后续的权限控制使用。

权限控制

最后,我们需要根据token中的信息进行权限控制。根据不同的用户角色,我们可以限制他们能够访问的资源或执行的操作。

// 资源访问控制注解
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/admin/resource")
public String adminResource() {
    // 只有具有ROLE_ADMIN角色的用户可以访问这个资源
    return "Admin resource";
}

在上面的代码中,我们使用了@PreAuthorize注解来限制只有具有ROLE_ADMIN角色的用户才能够访问/admin/resource这个资源。你可以根据实际需求来设置不同的权限控制规则。

状态图

下面是一个简单的状态图,描述了token权限的整个流程:

stateDiagram
    [*] --> 用户登录
    用户登录 --> 生成token
    生成token --> 用户登录成功
    用户登录成功 --> [*]
    用户登录失败 --> [*]
    [*] --> 请求资源
    请求资源 --> 验证token
    验证token --> token有效
    token有效 --> 鉴权通过
    鉴权通过 --> 返回资源
    验证token --> token无效
    token无效 --> 返回错误信息