使用springboot整合shiro和token实现用户的身份验证和权限控制

springboot+shiro简单token认证 前言 最后调用过程参考了 : https://blog.youkuaiyun.com/long270022471/article/details/62423286 最近可能要用到,所以看了看shiro. 结合人人开源的管理后端代码以及其他大佬的写的有关shiro的博文,自己整理了一下避免以后忘记了. 其中代码中我加了很多注释,是个人的通俗理解, 可能不正确, 也欢迎大家指出共同进步. Shiro的功能 Authentication:身份认证,验证用户是否拥有某个身份。 Authorization: 权限校验,验证某 阅读详情

使用springboot整合shiro和token实现用户的身份验证和权限控制

使用shiro请看:https://blog.youkuaiyun.com/sqlgao22/article/details/98506479
使用token请看:https://blog.youkuaiyun.com/sqlgao22/article/details/98532943

由于已经分别学习了shiro和token想到整合在一起使用会很好.
文章参考了:https://www.jianshu.com/p/0b1131be7ace,
这位老哥写的很详细,有点深奥,我就简单的做了,没有做太深,需要深入研究的可以看看老哥写的.
其实使用shiro的过滤器来判断token是否存在以及正确最重要的就是自定义shiro的过滤器,并且加入过滤器链.
用户的登录不需要使用到token,所有在用户身份验证(登录)环节不用使用到token,但是要额外的为已经登录的用户返回一个token.
在用户访问阶段需要做的就是,使用shiro的过滤器验证token的真实性,已经用户的权限.

项目依赖

 <!--shiro-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.3.2</version>
        </dependency>
<!--jjwt使用-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

自定义的realm

用于权限和身份的信息的提供.
如何不是很懂,为何自定义realm去看看前面的文章.

public class MyRealm extends AuthorizingRealm {
    @Resource
    private RolesMapper rolesMapper;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("============用户授权==============");
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        /*获取当前的用户,已经登录后可以使用在任意的地方获取用户的信息*/
        String username = (String) SecurityUtils.getSubject().getPrincipal();
        /*查询用户的权限*/
        Roles role = rolesMapper.getRole(username);
        /*将role放在一个集合中,多个权限使用集合*/
        info.addRole(role.getRole());
        return info;
    }
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("============用户验证==============");
        //从token中获取信息,此token只是shiro用于身份验证的,并非前端传过来的token.
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        String username = token.getUsername();
        String password = rolesMapper.getPassword(username);

        if (null == password) {
            throw new AuthenticationException("doGetAuthenticationInfo中的用户名不对");
        } else if (!password.equals(new String(token.getPassword()))){
            throw new AuthenticationException("doGetAuthenticationInfo中的密码不对");
        }
        //组合一个验证信息
        System.out.println("token.getPrincipal()默认返回的username======"+token.getPrincipal());
        System.out.println("getName()"+getName());
        SimpleAuthenticationInfo info = 
        	new SimpleAuthenticationInfo(token.getPrincipal(),password,getName());
        return info;
    }
}

自定义filter

这个重点在于你要继承哪个shiroFilter,主要还是根据需求进行不同的继承,如果自定义的内容很多还是继承较高的父级,如果功能需求不多,尽量还是使用shiro过滤器的一些原有的功能,我自己尝试了几个,最后继承了最终的实现类AuthenticationFilter;这过滤器就是我们过滤器链上key为的authc的过滤器.同时也对ajax做了区分.不能给ajax返回一个页面吧.
说明一下:这两个重写的方法.filter是否允许是由这两个方法决定的.
底层代码是:

return  isAccessAllowed()  || onAccessDenied()

isAccessAllowed:是否允许访问,当为true时就会允许,不需要执行onAccessDenied了.
onAccessDenied:只有当isAccessAllowed为false为false时才会执行,所以可以理解为,不允许访问后要怎么告诉用户的方法.或是一些其他的操作.

public class ClientShiroThree extends AuthenticationFilter {
    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse response1) throws Exception {
        HttpServletResponse response = (HttpServletResponse) response1;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String ajax = request.getHeader("x-requested-with");
        if (null==ajax) {
            System.out.println("=====不是ajax");
            response.sendRedirect("/login");
        }else {
            System.out.println("=====是ajax"+ajax);
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("访问有问题");
        }
        return false;
    }
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse response, Object mappedValue) {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String token = request.getHeader(TokenUtil.tokenHeard);
        System.out.println("================"+token);
        if (null == token||"".equals(token)) {
            System.out.println("-------------------token为空");
            return false;
        }
        //验证token的真实性
        try {
            TokenUtil.getTokenBody(token);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("----------------token有问题");
            return false;
        }
        return true;
    }
}

然后进行shiro配置

这个重点就是如何将自定义的filter加入过滤链,
其实就是先取出来链,加一个,在放进去!!!

@Configuration
public class ShiroConfig {
    @Bean
    public Realm myRealm() {
        return new MyRealm();
    }
    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(myRealm());
        return manager;
    }
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean();
        filter.setSecurityManager(securityManager());

        //加入自定义的filter
        Map<String, Filter> filterMap = filter.getFilters();
        filterMap.put("client", new ClientShiroThree());
        filter.setFilters(filterMap);

        //定义相关路径
        filter.setLoginUrl("/login");
        filter.setUnauthorizedUrl("/noAuthorize");

        //定义拦截路径,记得将静态资源也排除过滤
        /*进行权限的控制,必须使用LinkHashMap,shrio要按照顺序进行设置*/
        Map<String, String> authMap = new LinkedHashMap<>();
        authMap.put("/guest/**", "anon");
        authMap.put("/static/**", "anon");
        authMap.put("/user/**", "client,roles[user]");
        authMap.put("/admin/**", "client,roles[admin]");
        authMap.put("/login", "anon");
        authMap.put("/**", "client");
        filter.setFilterChainDefinitionMap(authMap);

        //配置完成
        System.out.println("---------------shirofactory创建成功");
        return filter;
    }
}

最后别忘了token的解析和生成

所有的信息都在token中储存,shiro只是负责验证.

public class TokenUtil {
    private static final String secret = "secret";
    public static final String tokenHeard = "tokenHead";
    private static final Long expTime = 60 * 5 * 1000L;

    public static String getToken(String name,String id,String ip) {
        JwtBuilder builder = Jwts.builder();
        builder.signWith(SignatureAlgorithm.HS256,secret);
        builder.setId(id).setSubject(name).setAudience(ip);
        builder.setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + expTime));
        String token = builder.compact();
        return token;
    }

    public static Claims getTokenBody(String token) {
        JwtParser parser = Jwts.parser();
        Claims body = parser.setSigningKey(secret).parseClaimsJws(token).getBody();
        return body;
    }

    public static String getName(String token) {
        Claims body = getTokenBody(token);
        String id = body.getId();
        return id;
    }
}

验证准备

package com.jd.controller;

import com.jd.dao.RolesMapper;
import com.jd.domain.Roles;
import com.jd.token.TokenUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class LoginController {
    @Resource
    private RolesMapper rolesMapper;
    
    @RequestMapping("/get")
    @ResponseBody
    public Object get() {
        List<Roles> roles = rolesMapper.getAllRoles();
        return roles;
    }

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String notLogin() {
        return "login";
    }

    @RequestMapping("/main")
    @ResponseBody
    public String test() {
        return "main";
    }

    @RequestMapping(value = "/noAuthorize")
    @ResponseBody
    public String notRole() {
        return "您没有权限!";
    }

    @RequestMapping(value = "/logout", method = RequestMethod.GET)
    @ResponseBody
    public String logout() {
        Subject subject = SecurityUtils.getSubject();
        //注销
        subject.logout();
        return "成功注销!";
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public String login(String name, String password, HttpServletRequest request, HttpServletResponse response) {
        try {
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(name, password);
            subject.login(usernamePasswordToken);
            Roles role = rolesMapper.getRole(name);
            String token = TokenUtil.getToken(role.getName(), role.getId(), request.getRemoteAddr());
            return token;
        } catch (Exception e) {
            e.printStackTrace();
            return "error";
        }
    }
}
前端没有变化
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    <script src="/static/jquery-3.4.1.min.js"></script>
    <script>
        /*设置token为全局变量*/
        var token = ''
        function fun02() {
            var name = $("#name").val()
            var password = $("#password").val()
            $.ajax({
                url: "/login",
                type: "post",
                data: {
                    name: name,
                    password: password
                },
                success: function (data) {
                    token = data
                    alert(token)
                }
            })
        }

        function fun01() {
            $.ajax({
                url: "/admin/msg",
                type: "get",
                data: {},
                headers: {'tokenHead': token},
                success: function (data) {
                    alert(data)
                }
            })
        }
    </script>
</head>
<body>
<form id="login">
    姓名:<input type="text" name="username" id="name"><br>
    密码:<input type="password" name="password" id="password"><br>
    <input type="button" value="登录" onclick="fun02()">
</form>
<br>
<input type="button" value="ajax请求" onclick="fun01()">
</body>
</html>

验证

当访问login页面的时候正常,当没有登录时访问其他页面会报错,
当登录之后,就会返回token:
在这里插入图片描述
当再次访问的时候就会出现访问成功了.
当权限不够时,就会报错没有权限.

Shiro + JWT实现Token验证的快速入门 章节目录1. 用户认证1.1 Session认证1.1.1 什么是Session?1.1.2 什么是Session认证? 1. 用户认证 用户认证一般分为:Session认证、Token认证(JWT是一种特殊的Token认证) 1.1 Session认证 Session认证用于一般的Web项目中。 1.1.1 什么是Session? HTTP协议是一种无状态协议。即:每次服务端接收客户端的请求时,都是一个全新的请求,服务端并不知道客户端的历史请求。例如说:当客户端进行账号和密码通过了身份认证,接着向服务端发 阅读详情

相关推荐

Springboot基础学习之(十七):通过Shiro实现用户得到登录认证和授权

springboot项目:通过shiro实现用户的认证和授权服务 设置网页的访问权限,不同的网页是具有不同的权限的用户才能够访问的

m0_52479012的博客 3640

Shiro学习随笔【二】身份认证

一、身份认证也就是提供相应的凭证证明你是用户本人,通常是指用户名和密码,在Shiro中用户需要体用Principals(身份)、Credentials(证明)给shiro,从而能够验证用户的身份。 Principals:身份,即主题的标识属性,可以有多个如邮箱、手机号、用户名等,但是只能有一个主身份标识。 Credentials:证明/凭证,即用户的密码或者数字证书。   二、用户的登录和...

OceanSky的专栏 918

Spring Boot 整合 Shiro 实现 Token 的登录和认证

Spring Boot 2.X 实战--Shiro (Token)登录和验证 主要介绍了 Spring Boot 整合 Spring Security 实现 Token 的登录和认证,这一小节中,我们将实现 Spring Boot 整合 Shiro 实现 Token 的登录和认证。 目录结构 1)Apache Shiro 简介 2)Shiro 项目配置 2.1)项目配置 3)开始...

u011202388的博客 6415

Shiro + SpringBoot 整合 JWT

JWT JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。 我们利用一定的编码生成 Token,并在 Token 中加入一些非敏感信息,将其传递。 一个完整的 Token : eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3Vz...

零度的博客 1万+

Springboot+Shiro+Jwt实现简单的权限控制

因为需要实现一个设备管理系统的权限管理模块,在查阅很多博客以及其他网上资料之后,发现重复、无用的博客很多,因此写一篇文章来记录,以便后面复习。书写顺序。

weixin_39158966的博客 1851

springboot集成shiro完成token认证,以及需要注意的点

注意 :继承 UsernamePasswordToken 类后,账号跟密码使用了 UsernamePasswordToken 类的构造方法2.自定义Realm@Override//授权@Override/*常见的方法:addRole(String role):向授权信息中添加角色。addRoles(Collection roles):向授权信息中添加多个角色。

qq_26112725的博客 2297

Springboot+jwt+shiro实现用户权限控制

目录 JWT Shiro 实现过程 1.Springboot环境搭建 2.实现JwtToken、JwtUtil、JwtFilter、这三个类 最近在做前后分离项目,前端验证用到了JWT,后端用的shiro做权限验证,基于springboot实现JWT+Shiro鉴权。 JWT JWT 英文名是 Json Web Token ,是一种用于通信双方之间传递安全信息的简洁的、URL安全的表述性声明规范,经常用在跨域身份验证。 JWT 以 JSON 对象的形式安全传递信息。因为存在数字签名,因此所传递的信息是安全

编程不良人 1795

SpringBoot整合Shiro与JWT的权限管理系统设计与实现

Apache Shiro 是一个强大且灵活的 Java 安全框架,广泛用于企业级应用中,提供了身份验证(Authentication)、授权(Authorization)、加密(Encryption)和会话管理(Session Management)等功能。它设计简洁,易于集成到 SpringBoot 等主流框架中。本章将系统地讲解 Shiro 的核心功能,包括其基本架构、权限控制机制、Web 应用集成方式及安全策略配置方法,帮助开发者理解 Shiro 的工作原理,并为后续集成 JWT 打下基础。

weixin_42593549的博客 975

SpringBoot 整合 Shiro 实现登录拦截

文章目录Shiro 简介什么是 Shiro?Shiro 的基本功能Shiro 的架构Shiro 的认证流程SpringBoot 整合 Shiro添加 Maven 依赖HTML 页面自定义 UserRealm(用户认证)Shiro 配置类(登录拦截)Controller测试 Shiro 简介 什么是 Shiro? Apache Shiro 是一个 Java 的安全(权限)框架 Shiro 可以非常容易的开发出足够好的应用,不仅可以用在 Java SE 环境,也可以用在 Java EE 环境 Shiro 可以

Woo_home的博客 1215

智能座舱(七)——智能音频系统

本文剖析车载智能音频系统的核心技术,聚焦音响、功放、麦克风和广播收音机四大组件。音响系统通过多声道布局(如23扬声器阵列)结合动态声场校准算法,实现三维声场覆盖;功放系统采用高效D类技术,支持OTA音效调整和故障自愈;麦克风阵列运用波束成形技术实现精准拾音,并保障隐私安全;广播系统融合数字与网络技术提升音质。核心在于硬件标准化与算法差异化的协同,未来将朝集成化、AI个性化方向发展。

DC20160101的博客 1574

Creo二次开发环境配置与DLL项目实战指南(Creo8.0+VS2019)

本文详细介绍了Creo8.0与VS2019环境下的二次开发配置与DLL项目实战指南,涵盖环境准备、版本匹配、DLL项目创建、核心代码编写、部署调试及常见报错处理。重点解析了Creo二次开发中的关键配置和优化技巧,帮助开发者高效解决实际问题。

weixin_28432777的博客 517

【SpringBoot】2021终极版shiro+jwt整合策略,包含shiro1.5+新特性,极简配置,全网独家。

目前最好的shiro+jwt整合策略,2021终极版,更新更简洁,包含shiro1.8新特性。 2021年发布shiro1.8带来了质的飞跃,对于本文的需求来说,最利好的包括两点:一是增加了对SpringBoot自动装配机制的支持;二是增加了BearerHttpAuthenticationFilter这个默认过滤器,从而让Jwt的整合获得了原生级的适配性。以上两项特性大大精简了我们的配置工作,且让当前网络上所有的教程都落后于时代。(包括官网和英文网络,搜到的教程基本都是旧版本的配置。)...........

ckw1988的专栏 7256

IEEE Transaction期刊模板使用注意事项

本文将总结使用IEEE Transactions系列期刊的投稿模板时的一些注意事项,包括模板本身的使用规范、参考文献的正确格式等其他内容。

weixin_39529207的博客 2万+

从前慢-Shiro和JWT

权限的管理 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。 身份认证 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。 授权 授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问.

unique_perfect的博客 9132

1991-2020年气候背景数据集

2011 年,国家气象信息中心对 1951-2010 年 2400 余个地面站气温、气压、降水、湿度、日照等 19 大要素项的定时观测资料和日极值资料中由数字化过程中引起的系统性问题(例如数字化遗漏、整段拷贝等问题)进行质量检测、质量控制和错误数据的更正,形成较高质量的地面基础资料集。1991-2020年中国地面气候值数据集提供了中国2438个站点的气温、降水、气压、风向风速、相对湿度、水汽压、云、天气现象、能见度、蒸发、积雪、地温、冻土、日照共14个要素的气候背景信息。数据时间:30年平均。

地球资源数据云的官方博客 1597

802.11ax 的OFDMA资源分配详解

802.11ax 引入的最重要的技术就是OFDMA。OFDMA中引入了RU(资源块)概念,也就是20Mhz/40Mhz/80Mhz/160Mhz的带宽可以切割成不同尺寸的RU,分配给不同的用户使用,这样就大大提高了频谱资源的利用率。 常见的RU尺寸有26/52/102/242/484/996,单位是子载波,每个子载波是78.125Khz,这样20Mhz的带宽可以划分为如下图所示的不同RU大小。 按照11ax规范的要求,上下行的数据传输都可以由AP来统一调度,这样上下行的OFDM...

weixin_43408952的博客 1万+

springboot环境下Shiro+Token+Redis安全认证方案

认证我们接收filter传过来的token,并认证login操作的token授权获取到登录用户信息,并取得用户的权限存入roles,以便后期对接口进行操作权限验证/***大坑!,必须重写此方法,不然Shiro会报错}/***授权**@returnlog.info("Shiro权限配置");}/***认证**@returnlog.info("Shiror认证");isAccessAllowed()判断是否可以登录到系统/**...

qq_38785977的博客 3万+

Open-AutoGLM 实战:手把手教你用 AI 操作手机「喂饭教程」

Open-AutoGLM 是一个由智谱AI开源的手机操作智能体框架,由手机端智能助手框架Phone Agent和9B大小的模型AutoGLM-Phone-9B组成,借助ADB自动执行点击、滑动、输入等操作——用户只需用自然语言描述任务,系统便能自动规划并完成整个操作流程。

blues_C的博客 1267

Spring Boot 2.X 实战--Shiro(Token)登录和注册

源代码仓库:https://github.com/zhshuixian/learn-spring-boot-2 在上一节"Spring Security (Token)登录和注册"中,主要介绍了 Spring Boot 整合 Spring Security 实现 Token 的登录和认证,这一小节中,我们将实现 Spring Boot 整合 Shiro 实现 Token 的登录和认证。 1)A...

Java 小先 990

【超详细】MIT 液态神经网络(LNNs)——深度学习新动向

输入可以是任何形式的时间序列数据,其中表示时间。例如传感器读数、金融市场数据、语音信号等。

allein_STR的博客 2611

白皮精读:70页 2025 基于数据空间的金融数据可信流通研究报告【附全文阅读】

金融数据可信流通面临法规、技术与商业模式的挑战。报告分析国内外发展现状,提出基于数据空间的可信流通框架,包含典型场景、技术方案与流通模式。实践案例显示,隐私计算、区块链等技术可提升风控效率与合规性。建议完善数据分类分级、统一技术标准并推动行业试点,以释放数据要素价值,促进数字经济发展。

cdfunlove的博客 849

Springboot下Shiro+Token使用redis做安全认证方案

以前项目中权限认证没有使用安全框架,都是在自定义filter中判断是否登录以及用户是否有操作权限的。 最近开了新项目,搭架子时,想到使用安全框架来解决认证问题,spring security太过庞大,我们的项目不大,所以决定采用Shiro 什么是Shiro Apache Shiro 是一个强大灵活的开源安全框架,可以完全处理身份验证、授权、加密和会话管理。 Realm是Shiro的核心组建,也一样是两步走,认证和授权,在Realm中的表现为以下两个方法。 认证:doGetAuthenticationI.

Youdmeng的博客 1798

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【SpringBoot框架篇】16.security整合jwt实现对前后端分离的项目进行权限认证

使用Spring Security+JWT实现对前后端分离的项目进行权限认证

皓亮君的博客 5658

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Springboot整合shiro+jwt---实现单点登录,权限认证和控制+实现代码

shiro用来认证用户及权限控制,jwt用来生成一个token,暂存用户信息。jwt生成一个token存储在客户端,每次请求将其存储在header中,解决了跨域,可以通过自定义的方法进行验证,解决了分布式验证的问题。 大体包含哪些类 (1)LoginAction.java (controller层)。 (2)JwtUtil.java(工具类):实现了利用登陆信息生成token,更新token,根据token获取username,token验证等方法。 (3)JWTFilter.java(过滤器):拦截除登陆

m0_67402970的博客 2795

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

单realm模式下前后端分离实现springboot+shiro+jwt+vue整合

Springboot+Shiro前后端分离项目 1.shiro局限性 基于前后端分离的版本,其实shiro框架应用缺少了很多实用的功能。比如remenber me,比如Session,都无法正常使用。同时,每次访问后端,都需要重新进入realm中认证,如遇到权限判断,也每次都要重新授权,虽然可以使用redis减少数据库的压力,但是,每次认证和授权确实烦不胜烦。 ......

马疯蜗的博客 972

SpringBoot整合jwt+shiro

话不多说,直接上代码 引入依赖如下的依赖,springboot不够构建的请先把springboot玩熟了在回来看吧。 <!-- JWT依赖 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0&l

weixin_38064520的博客 710
上一篇: 如何区分ajax请求和非ajax请求
下一篇: 使用POI创建一个excel文件
黑白格tt
博客等级 码龄8年 35粉丝 45原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值