Springboot实现简单JWT登录鉴权

登录为啥需要鉴权?

登录需要鉴权是为了保护系统的安全性和用户的隐私。在一个 Web 应用中,用户需要提供一定的身份信息(例如用户名和密码)进行登录,登录后系统会为用户生成一个身份令牌(例如 JWT Token)来标识用户的身份。

鉴权的主要目的是确保只有经过身份验证的用户才能访问系统的受限资源和功能。未经鉴权的用户不能访问系统的敏感信息和功能,从而保护系统的数据和用户的隐私。

为什么选择JWT做登录鉴权?

选择 JWT(JSON Web Token)做登录鉴权有以下几个主要优点:

1.无状态

JWT 是无状态的,即服务端不需要保存用户的登录状态。所有的用户信息都包含在 JWT 中,因此服务端不需要在后台存储用户的登录信息。这样可以降低服务端的存储压力,也减少了服务端与客户端之间的通信次数,提高了系统的性能和可扩展性。

2.安全性

JWT 使用数字签名来保证 Token 的完整性和安全性。服务端在生成 JWT 时使用密钥对头部和载荷进行签名,客户端在接收到 JWT 后,可以通过验证签名来判断 Token 是否被篡改。这样可以防止 Token 被伪造或篡改,增强了系统的安全性。

3.跨平台支持

JWT 是基于 JSON 格式的标准化令牌,可以在不同平台之间方便地传递和解析。客户端可以将 JWT 存储在 Cookie、LocalStorage 或 SessionStorage 中,同时可以在移动端和 Web 端之间共享使用。

4.可扩展性

JWT 载荷部分可以自定义,可以存储用户的角色、权限、自定义字段等信息。这样可以在 Token 中携带更多的用户信息,减少多次查询数据库的开销,提高系统的性能。

5.简化权限管理

JWT 中可以包含用户的角色和权限信息,这样可以简化权限管理逻辑。服务端可以根据用户的角色和权限来控制用户对不同资源的访问权限,从而实现细粒度的权限控制。

JWT是token吗?

是的,JWT(JSON Web Token)是一种 Token 的实现方式。Token 是一种用于身份验证和授权的令牌,用于在客户端和服务端之间传递用户的身份信息。

JWT 是一种基于 JSON 的安全令牌,由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。这三部分分别使用 Base64 编码,并用点号连接起来,形成一个字符串,即 JWT。

实现一个简单的springboot拦截器token例子

1.创建拦截器类 TokenInterceptor.java:

java 复制代码
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TokenInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在这里进行 Token 鉴权逻辑
        // 获取请求头中的 Token
        String token = request.getHeader("Authorization");
        if (token == null || !token.startsWith("Bearer ")) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }

        // 假设这里对 Token 进行验证,验证通过则放行,否则返回 401 未授权状态码
        // 这里只是简单示例,实际中可以根据业务需求来验证 Token 的有效性
        boolean isValidToken = validateToken(token.substring(7)); // 去除 "Bearer " 前缀
        if (!isValidToken) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }

        return true;
    }

    private boolean validateToken(String token) {
        // 假设这里对 Token 进行验证,验证通过返回 true,否则返回 false
        // 可以使用 JwtUtils 工具类来验证 Token 的有效性
        // 注意:在实际应用中,需要根据业务需求和安全要求来验证 Token
        return true;
    }
}

2.注册拦截器:

在 Spring Boot 主类中注册拦截器,使其生效:

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
public class MyApplication implements WebMvcConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TokenInterceptor())
                .addPathPatterns("/api/**"); // 拦截指定路径的请求
    }
}

3.创建一个简单的 Controller

java 复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/api/hello")
    public String hello() {
        return "Hello, World!";
    }
}
相关推荐
长栎15 分钟前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode19 分钟前
Redis 在生产项目的使用
前端·后端
用户5598224812224 分钟前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode24 分钟前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战26 分钟前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha1 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn1 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425911 小时前
ShardingJDBC
后端
行者全栈架构师1 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 小时前
mac(m5)平台编译openjdk
java