权限管理系统-0.4.0

五、权限管理

5.1 引入JWT

JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。

JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。

JWT最重要的作用就是对 token信息的防伪作用。

在common-util模块中引入依赖:

        <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>

创建工具类,用于生成token和根据token获取用户名和用户id。

package pers.beiluo.yunshangoffice.common.jwt;import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;import java.util.Date;/*** 此类用于完成与token相关的功能* 例如:生成token或解析token等*/
public class JWTHelper {//token失效时间private static long tokenExpiration = 365*24*60*60*1000;//签名,根据签名进行加密private static String tokenSignKey = "adcde";//创建tokenpublic static String createToken(Long userId,String username){return Jwts//创建JWT实例.builder()//设置类别,表示这个Jwt面向的用户.setSubject("AUTH-USER")//设置token的失效时间.setExpiration(new Date(System.currentTimeMillis()+tokenExpiration))//向claims属性中存值.claim("userId",userId).claim("username",username)//使用signkey进行签名.signWith(SignatureAlgorithm.HS512,tokenSignKey)//设置压缩方法.compressWith(CompressionCodecs.GZIP)//返回完整的JWT.compact();}//获取用户idpublic static Long getUserId(String token){try {if(StringUtils.isEmpty(token)){return null;}Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);Claims body = claimsJws.getBody();//通过claim获取用户idreturn ((Integer)body.get("userId")).longValue();} catch (Exception e) {e.printStackTrace();return null;}}//获取用户名称public static String getUsername(String token){try {if(StringUtils.isEmpty(token)){return null;}Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);Claims body = claimsJws.getBody();return (String)body.get("username");} catch (Exception e) {e.printStackTrace();return null;}}}

5.2 用户登录

首先创建一个前后端数据交互的类:

@ApiModel("登录信息类")
@Data
public class LoginVo {//用户名@ApiModelProperty("用户名")private String username;//用户密码@ApiModelProperty("密码")private String password;}

创建MD5密码加密工具类:

package pers.beiluo.yunshangoffice.common.jwt;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public final class MD5 {public static String encrypt(String strSrc) {try {char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8','9', 'a', 'b', 'c', 'd', 'e', 'f' };byte[] bytes = strSrc.getBytes();MessageDigest md = MessageDigest.getInstance("MD5");md.update(bytes);bytes = md.digest();int j = bytes.length;char[] chars = new char[j * 2];int k = 0;for (int i = 0; i < bytes.length; i++) {byte b = bytes[i];chars[k++] = hexChars[b >>> 4 & 0xf];chars[k++] = hexChars[b & 0xf];}return new String(chars);} catch (NoSuchAlgorithmException e) {e.printStackTrace();throw new RuntimeException("MD5加密出错!!+" + e);}}public static void main(String[] args) {System.out.println(MD5.encrypt("111111"));}
}

修改IndexController中的方法:

    @ApiOperation("登录")@PostMapping("/login")public Result login(@RequestBody LoginVo loginVo){//根据用户名查询数据库LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();sysUserLambdaQueryWrapper.eq(SysUser::getUsername,loginVo.getUsername());SysUser one = sysUserService.getOne(sysUserLambdaQueryWrapper);//判断该用户是否存在if(null == one){throw new CustomizedException(201,"用户尚未注册");}//判断密码是否正确if(!one.getPassword().equals(MD5.encrypt(loginVo.getPassword()))){throw new CustomizedException(201,"用户名或密码错误");}//判断用户是否有效if(one.getStatus().intValue() == 0){throw new CustomizedException(201,"用户已被禁用");}//走到这里说明用户验证成功,返回tokenHashMap<String, Object> stringObjectHashMap = new HashMap<>();stringObjectHashMap.put("token", JWTHelper.createToken(one.getId(),one.getUsername()));return Result.ok(stringObjectHashMap);}

5.3 返回用户信息

//IndexController@ApiOperation("获取用户信息")@GetMapping("/info")public Result getInfo(HttpServletRequest request){//首先获取tokenString token = request.getHeader("token");//根据token获取用户idLong userId = 1L;//JWTHelper.getUserId(token);//获取用户信息LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();sysUserLambdaQueryWrapper.eq(SysUser::getId,userId);SysUser one = sysUserService.getOne(sysUserLambdaQueryWrapper);//获取用户角色信息Map<String, Object> roleOfUserById = sysUserService.getRoleOfUserById(userId);ArrayList<SysRole> assignedRole = (ArrayList<SysRole>) roleOfUserById.get("assignedRole");List<String> collect = assignedRole.stream().map(item -> item.getRoleName()).collect(Collectors.toList());//根据用户id获取菜单信息List<RouterVo> menuList = sysMenuService.getUserRouterList(userId);//根据用户id获取按钮权限信息List<String> permissionList = sysMenuService.getUserPermissionList(userId);//创建返回对象HashMap<String, Object> stringObjectHashMap = new HashMap<>();stringObjectHashMap.put("name",one.getName());stringObjectHashMap.put("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");stringObjectHashMap.put("roles",collect);stringObjectHashMap.put("buttons",permissionList);stringObjectHashMap.put("routers",menuList);return Result.ok(stringObjectHashMap);}
//SysMenuServiceImpl.getUserRouterList/*** 根据用户id获取菜单的路由结构* @param userId* @return*/@Overridepublic List<RouterVo> getUserRouterList(Long userId) {List<SysMenu> sysMenus = null;//判断是否为管理员,如果为管理员则直接返回所有菜单,假设用户id为1的是管理员,其余都为普通用户if(userId.longValue() == 1){LambdaQueryWrapper<SysMenu> sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();sysMenuLambdaQueryWrapper.eq(SysMenu::getStatus,1);//按照sort_value进行排序sysMenuLambdaQueryWrapper.orderByAsc(SysMenu::getSortValue);sysMenus = baseMapper.selectList(sysMenuLambdaQueryWrapper);}else{sysMenus = baseMapper.selectUserMenuList(userId);}//将用户拥有菜单转换成树形List<SysMenu> sysMenus1 = MyUtils.buildMenu(sysMenus);//创建返回对象,将树形菜单转换成路由形式ArrayList<RouterVo> routerVos = MyUtils.buildRouter(sysMenus1);return routerVos;}
//SysMenuServiceImpl/*** 根据用户id查询用户拥有的按钮权限* @param userId* @return*/@Overridepublic List<String> getUserPermissionList(Long userId) {List<SysMenu> sysMenus = new ArrayList<>();//如果用户为管理员,则查询所有菜单if(userId.longValue() == 1){LambdaQueryWrapper<SysMenu> sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();sysMenuLambdaQueryWrapper.eq(SysMenu::getStatus,1);sysMenus = baseMapper.selectList(sysMenuLambdaQueryWrapper);}else{sysMenus = baseMapper.selectUserMenuList(userId);}//从菜单列表中获取可以操作的按钮权限List<String> collect = sysMenus.stream().filter(ele -> ele.getType() == 2).map(ele -> ele.getPerms()).collect(Collectors.toList());return collect;}
<!--SysMenuMapper.selectUserMenuList,这个方法涉及多表联查,所以需要在xml文件中定义-->
<mapper namespace="pers.beiluo.yunshangoffice.mapper.SysMenuMapper"><!--映射关系在实体类中可以使用@TableField注解指定表字段与类字段的映射关系,在这里就可以开启自动映射如果开启了驼峰命名,并且是按照规范命名的,那么就不需要使用@TableFiled注解,也不需要resultMap标签--><resultMap id="userMenuMap" type="pers.beiluo.yunshangoffice.model.system.SysMenu" autoMapping="true"></resultMap><!--抽取列名--><sql id="columns">sm.id,sm.parent_id,sm.name,sm.type,sm.path,sm.component,sm.perms,sm.icon,sm.sort_value,sm.status,sm.create_time,sm.update_time,sm.is_deleted</sql><select id="selectUserMenuList" resultMap="userMenuMap">SELECT DISTINCT <include refid="columns" />FROM sys_role_menu srm INNER JOINsys_menu sm ON srm.menu_id=sm.idINNER JOIN sys_user_role sur ONsrm.role_id=sur.role_idWHERE sur.user_id=#{userId}AND sm.status=1AND srm.is_deleted=0AND sm.is_deleted=0AND srm.is_deleted=0</select></mapper>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/737737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言基础练习——Day05

目录 选择题 编程题 数字在升序数组中出现的次数 整数转换 选择题 1、如下程序的功能是 #include <stdio.h> int main() {char ch[80] "123abcdEFG*&";int j;puts(ch);for(j 0; ch[j] ! \0; j){if(ch[j] > A && ch[j] < Z)ch[j] ch[j] e…

智能测径仪在胶管行业的应用

关键字&#xff1a;胶管外径尺寸测量&#xff0c;胶管检测仪器&#xff0c;胶管外径检测&#xff0c;高温胶管外径检测&#xff0c;软硬胶管检测&#xff0c; 智能测径仪在家胶管行业中的应用主要体现在对胶管外径的精确测量和控制上。在胶管生产过程中&#xff0c;外径的大小直…

dubbo调用的自定义过滤器中设置MDC无法生效的问题

AI的解释 Dubbo自定义过滤器不生效可能有多种原因&#xff0c;以下是一些常见的原因及解决方法&#xff1a; 过滤器未正确配置&#xff1a; 检查过滤器是否已经在Dubbo的配置文件中正确声明&#xff0c;并且已经添加到过滤器链中。在XML配置中&#xff0c;应使用<dubbo:se…

Python3虚拟环境之pipenv

pipenv是python官方推荐的包管理工具&#xff0c;集成了virtualenv, pip和pyenv三者的功能。集合了所有的包管理工具的长处&#xff0c;自动为项目创建和管理虚拟环境。 安装 pip install pipenv在Pycharm中使用 修改Pipfile的安装源参数url&#xff0c;改为https://pypi.tun…

Valid8Proxy:一款功能强大的工作代理获取、验证和存储工具

关于Valid8Proxy Valid8Proxy是一款功能强大且用户友好的代理管理工具&#xff0c;该工具功能丰富&#xff0c;旨在帮助广大研究人员获取、验证和存储工作代理的相关信息。 无论你是需要用于网络资源爬取、网络数字匿名化还是测试网络安全的代理&#xff0c;Valid8Proxy都可以…

应用方案 |安防摄像头(IPC)的步进马达及IR-CUT驱动芯片D6212

应用领域 安防摄像头&#xff08;IPC&#xff09;的步进马达及IR-CUT驱动。 02 功能介绍 D6212内置8路带有续流二极管的达林顿驱动管阵列和一个H桥驱动&#xff0c;单芯片即可实现2个步进电机和一个IR-CUT的直接驱动&#xff0c;使得电路应用非常简单。单个达林顿管在输入…

java异常概述及自定义处理

前言 学到异常了&#xff0c;本来以为处理异常只是避免bug&#xff0c;结果发现还可以为了编程需要自定义异常。打好基础&#xff0c;daydayup! 异常 什么是异常 异常就是代表程序出现的问题 异常的体系 异常体系指的是java开发人员为了方便程序员使用所开发的异常类&#xff…

【喜报!】科大睿智为企业成功通过CMMI5级评估!

山东智云信息科技有限公司成立于2011年&#xff0c;总部地处泉城济南&#xff0c;一直专注于生态环境信息化领域解决方案的咨询设计、产品研发、项目实施和系统集成类服务&#xff0c;致力于成为固定污染源监管与非现场精准执法领域的领军企业。 山东智云拥有100余名生态环境信…

C++ 作业 24/3/11

1、提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数&#xff08;要求使用C风格字符串完成&#xff09; #include <iostream>using namespace std;int main() {string str;cout << "please enter str:&…

0基础、适合转行学Python吗?

01 对于0基础的人&#xff0c;直接学 Python 编程合适吗&#xff1f; 在目前的编程语言中&#xff0c;Python的抽象程度是最高的&#xff0c;是最接近自然语言的&#xff0c;非常容易上手&#xff0c;Python 可以让你更好的理解编程这件事情。 所以&#xff0c;我只能说非常…

最新免费好用的手机数据恢复软件EasyRecovery易恢复 2024

easyrecovery pro在easyrecovery的基础上进行了全新的升级&#xff0c;对于可恢复的内容进行了深度的开发&#xff0c;easyrecovery pro相比较旧版的easyrecovery而言&#xff0c;可恢复的选项更多&#xff0c;时间跨度也更长。easyrecovery pro简介&#xff1a;1、非常强大的数…

掼蛋的牌型与规律(下篇)

一、三不带 一般出三不带有几种情况&#xff1a;没有对子配、对子和三张数量不匹配、对子成了三连对、对子太大。作为发牌方&#xff0c;首发三不带可以迷惑对手。三不带打出来很难处理&#xff0c;如果接了三不带可能就会将小对子留下&#xff0c;不接又不甘心让对方继续有出牌…

知识积累(四):无

文章目录 1. KL散度2. GELU 激活函数3. 向量运算4. bert4.1 词嵌入4.2 cross-encoder 模型4.3 bert 架构4.4 bert 池化操作 5. Fid 模型&#xff08;Fusion-in-Decoder&#xff09;6. 多分类损失函数6.1 交叉熵损失6.2 softmax 损失 7. t-sne8. NDCG参考资料 1. KL散度 衡量两…

【开发】JavaWeb开发中如何解析JSON格式数据

目录 前言 JSON 的数据类型 Java 解析 JSON 常用于解析 JSON 的第三方库 Jackson Gson Fastjson 使用 Fastjson Fastjson 的优点 Fastjson 的主要对象 JSON 接口 JSONObject 类 JSONArray 类 前言 1W&#xff1a;什么是JSON&#xff1f; JSON 指 JavaScrip t对象表…

业界主流数据加速技术路线

计算存储分离已经成为云计算的一种发展趋势。在计算存储分离之前&#xff0c;普遍采用的是传统的计算存储相互融合的架构&#xff0c;但是这种架构存在一定的问题&#xff0c;比如在集群扩容的时候会面临计算能力和存储能力相互不匹配的问题。用户在某些情况下只需要扩容计算能…

交流负载箱的特点和优势有哪些?

交流负载箱广泛应用于电力系统、新能源、轨道交通、航空航天等领域。它具有以下特点和优势&#xff1a; 1. 灵活性高&#xff1a;交流负载箱可以根据实际需求&#xff0c;调整输出电流、电压、功率等参数&#xff0c;以满足不同场景下的测试需求。同时&#xff0c;它还可以实现…

App自动化测试之Appium 环境搭建保姆级教程(全网最全)

前言 APP自动化测试运行环境比较复杂&#xff0c;稍微不注意安装就会失败。我见过不少朋友&#xff0c;装了1个星期&#xff0c;Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作&#xff0c;但是 Appium 安装过程中确实存在不少隐藏的比较深的坑&#xff…

低代码平台如何选型 盘点国内外主流低代码开发平台

随着数字化转型的加速&#xff0c;低代码开发平台作为一种新型软件开发方式&#xff0c;受到了广泛关注。国内低代码市场也呈现出蓬勃发展的态势&#xff0c;各种低代码平台如雨后春笋般涌现。本文将对国内低代码平台进行盘点&#xff0c;以帮助企业和开发者更好地了解市场情况…

strstr函数、chdir函数、access函数、strdup函数的介绍

1、strstr函数 strstr 是 C 语言中的一个字符串处理函数&#xff0c;用于在一个字符串中查找子字符串的第一次出现。 函数原型 char *strstr(const char *haystack, const char *needle); haystack&#xff1a;要在其中搜索的字符串。needle&#xff1a;要查找的子字符串。 函…

如何正确选择国外服务器的带宽和线路呢?

国外大带宽服务器是一种提供高带宽、高速网络连接和良好稳定性的服务器&#xff0c;但在中国使用这类服务器可能涉及到违反法律法规的风险。因此我无法为你提供相关帮助。接下来和源库一起了解如何正确选择国外服务器的带宽和线路呢? 考虑目标用户的地理位置。如果目标用户主要…