从零玩转SpringSecurity+JWT整合前后端分离1

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 从零玩转SpringSecurity+JWT整合前后端分离

一、什么是Jwt?

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准

((RFC 7519).该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。

JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服

务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于

认证,也可被加密。

官网:https://jwt.io/introduction/

简单的说:jwt就是一个json字符串 它可以存储任何信息。

内置了校验-我们只需要请求时给到它生产出来的token令牌即可解析到我们存储进去的信息。

1.创建jwtDemo Maven工程

image-20210408165757706-6706192eb25349c7979b20a95a64722e.png

<!-- 添加 jwt 的依赖 -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.11.0</version>
            </dependency>

2.创建jwtTest.class

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * ClassName: JwtTest
 * 个人博客: https://yby6.com
 * @author yangbuyiya
 * @Date: 2021-03-25 10:05
 * @Description: $
 **/
public class JwtTest {
    /**
     * 加密jwt
     *
     * @param username
     * @return
     */
    public static String createJwt(String username) {
        // 颁发时间
        Date createTime = new Date();
        // 过期时间
        Calendar now = Calendar.getInstance();
        // 设置未来时间 秒
        now.set(Calendar.SECOND, 7200);
        Date expireTime = now.getTime();
        // header
        Map<String, Object> header = new HashMap<>(4);
        header.put("alg", "HS256");
        header.put("type", "JWT");
        // 载体
        return JWT.create()
                // 设置头部信息
                .withHeader(header)
                // 设置创建时间
                .withIssuedAt(createTime)
                // 设置过期时间
                .withExpiresAt(expireTime)
                // 设置主体
                .withSubject("这是一个JWT")
                // 设置载荷--也就是用户信息
                .withClaim("username", username)
                .withClaim("pwd", "123456")
                // 设置签名密钥
                .sign(Algorithm.HMAC256("yby-jwt"));
    }
    /**
     * 解密jwt
     *
     * @param jwt
     * @return
     */
    public static boolean decryptJwt(String jwt) {
        // 带入密钥解密
        JWTVerifier require = JWT.require(Algorithm.HMAC256("yby-jwt")).build();
        try {
            DecodedJWT verify = require.verify(jwt);
            // 根据设置的key获取对应的value
            Claim username = verify.getClaim("username");
            System.out.println(username.asString());
            System.out.println(verify.getSignature());
            System.out.println(verify.getSubject());
            return true;
        } catch (JWTVerificationException e) {
            e.printStackTrace();
            return false;
        }
    }
    public static void main(String[] args) {
        // 创建令牌
        System.out.println(createJwt("杨不易"));
 // 解析令牌       System.out.println(decryptJwt("eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiLov5nmmK_kuIDkuKpKV1QiLCJleHAiOjE2MTcwODAyMjAsInB3ZCI6IjEyMzQ1NiIsImlhdCI6MTYxNzA3MzAzMSwidXNlcm5hbWUiOiLmnajkuI3mmJMifQ.GJOeFSVsAwFPcgUlalmxVXt0QQ-Be5bhGUtL1ep04vM"));
    }
}

3.测试jwt

创建令牌

image-20210408164516157-c5ab7dfe9dfd401fbb980882b8a25e0a.png

解析令牌信息

image-20210408164641576-665d415499a04247b795a2daa185b3df.png

4.JWT的总结

JWT就是一个加密的带用户信息的字符串,没学习JWT之前,我们在项目中都是返回一个基本的

字符串,然后请求时带上这个字符串,再从session或者redis中(共享session)获取当前用户,

学过JWT以后我们可以把用户信息直接放在字符串返回给前段,然后用户请求时带过来,我们是在

服务器进行解析拿到当前用户,这就是两种登录方式,这两种方式有各自的优缺点,我们在后面

Oauth2.0+jwt中详细学习

二、什么是SpringSecurity?

Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案 的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC, DI(控制反转 Inversion of Control ,DI:Dependency Injection 依赖注入)和 AOP(面向切 面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量 重复代码的工作。 以上解释来源于百度百科。可以一句话来概括,SpringSecurity 是一个安全框架。

1.Spring Security 入门体验

创建项目 springsecurity-hello

image-20210408170254199-7aa6d318f41d46a7baf638f1418663bb.png

创建Controller请求访问

image-20210408170650072-fb93add987544a39a491e2b37bff3264.png

启动测试访问

http://127.0.0.1:8080/hello

发现我们无法访问 hello 这个请求,这是因为 spring Security 默认拦截了所有请求

image-20210408170735306-688b0b9570d4403591dda921c382f0b7.png

我们在启动日志当中复制密码

image-20210408170802657-6aa7a33eb79a43088e06446940db27ef.png

用户名默认是 user 哦

image-20210408170834997-d59dd6b060f14706b623d6513e5c7bb9.png

登录成功之后访问 controller

image-20210408171302549-7c3b15f2bba74545a821e25ae25d1f6e.png

测试退出

页面当中输入: http://127.0.0.1:8080/logout

image-20210408171039986-e6e431cc774d4de497b90fa36ec5c869.png

自定义密码登录(yml 配置文件方式)

spring:
  security:
   user:
   name: admin #默认使用的用户名
   password: 123456 #默认使用的密码

重启使用 admin 和 123456 登录即可

总结

从上面的体验来说,是不是感觉很简单,但是别急。后面的东西还是有点难度的,

如下:

如何读取数据库的用户名和密码

如何对密码加密

如何使用数据的角色和权限

如何配置方法级别的权限访问

如何自定义登陆页面

如何集成 redis 把登陆信息放到 Redis

相关文章
|
6月前
|
安全 Java Spring
Spring Security+jwt实现认证
Spring Security+jwt实现认证
|
6月前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
209 0
|
20天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
34 0
|
2月前
|
安全 Java 数据安全/隐私保护
|
3月前
|
NoSQL 关系型数据库 MySQL
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
155 2
|
5月前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
499 0
|
6月前
|
安全 Java Spring
Spring Security整合JWT
该文档介绍了Spring Security与JWT的整合应用。在前后端分离的项目中,为了解决权限问题,通常采用Spring Security结合JWT的方案。文档涵盖了认证流程,包括同步认证和前后端分离认证,并详细说明了认证实现步骤,如环境准备、所需依赖(包括JWT库和Hutool工具包)的添加。此外,还提到从先前项目复制代码和配置以简化环境搭建。
215 6
|
6月前
|
安全 Java 数据库
SpringSecurity+JWT前后端分离架构登录认证
在SpringSecurity实现前后端分离登录token认证详解_springsecurity前后端分离登录认证-CSDN博客基础上进行重构,实现前后端分离架构登录认证,基本思想相同,借鉴开源Gitee代码进行改造,具有更好的代码规范。
340 1
|
6月前
|
JSON 前端开发 安全
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-2
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
116 0
|
3月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
240 0
下一篇
无影云桌面