cloud_mall-notes01

1、登录

1.1 获取token令牌

登录时的ajax请求:
在这里插入图片描述

后端路由配置处理:

登录的路由配置
作用:把oAuth2.0颁发的token存储到redis中

package com.powernode.config;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.powernode.constant.GatewayConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import reactor.core.publisher.Mono;import java.time.Duration;/*** 登录的路由配置* 作用:把oAuth2.0颁发的token存储到redis中*/
@Configuration
public class LoginRouteConfig {@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 代码方式的路由存储token** @param builder* @return*/@Beanpublic RouteLocator loginRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("auth-server-route", r -> r.path("/oauth/token").filters(f -> f.modifyResponseBody(String.class, String.class, (exchange, s) -> {//s为响应的结果,类型为json,结构为{"access_token","expires_in"}//将响应的json数据转换为json对象JSONObject jsonObject = JSON.parseObject(s);//查看是否包含access_tokenif (jsonObject.containsKey("access_token")) {//有:存放到redis中//获取token值和过期时间String access_token = jsonObject.getString("access_token");Long expires_in = jsonObject.getLong("expires_in");//将获取的值存放到redis中stringRedisTemplate.opsForValue().set(GatewayConstant.TOKEN_PREFIX+access_token,"", Duration.ofSeconds(expires_in));}return Mono.just(s);//uri是路由的目的地,(lb://auth-server是授权中心服务名称)})).uri("lb://auth-server")).build();}
}

Redis拿到的缓存:
在这里插入图片描述

前端返回响应的JSON数据,与Redis一致:
在这里插入图片描述
解析部分JSON数据:
在这里插入图片描述

前端代码处理token,放进cookie中:在这里插入图片描述

1.2 根据用户标识获取菜单和权限集合

前端发出的 ajax 请求:
在这里插入图片描述

.

利用mybatis的一个插件,生成相应的代码:
在这里插入图片描述
在这里插入图片描述
.

会生成domain实体类,service接口及实现类,mapper接口及实现xml文件:
在这里插入图片描述
在这里插入图片描述
.
创建一个controller类:controller.SysMenuController

package com.powernode.controller;import com.powernode.domain.SysMenu;
import com.powernode.service.SysMenuService;
import com.powernode.utils.AuthUtil;
import com.powernode.vo.MenuAndAuth;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;@Api(tags = "菜单权限接口管理")
@RequestMapping("sys/menu")
@RestController
public class SysMenuController {@Autowiredprivate SysMenuService sysMenuService;@ApiOperation("根据用户标识查询菜单和权限集合")@GetMapping("nav")public ResponseEntity<MenuAndAuth> loadUserMenuAndAuth() {//获取用户标识
//        String userId = SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString();String userId = AuthUtil.getLoginUserId();//根据用户标识查询菜单和权限集合//获取权限集合Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();List<String> auths = authorities.stream().map(Objects::toString).collect(Collectors.toList());//根据用户id查询菜单集合List<SysMenu> sysMenuList = sysMenuService.selectSysMenuListByUid(userId);//成功,并没有数据返回
//        return ResponseEntity.ok().build();//成功,有数据返回
//        return ResponseEntity.ok(数据);MenuAndAuth menuAndAuth = new MenuAndAuth(sysMenuList,auths);return ResponseEntity.ok(menuAndAuth);}//    sys/menu/table@ApiOperation("查询系统权限集合")@GetMapping("table")@PreAuthorize("hasAuthority('sys:menu:list')")public ResponseEntity<List<SysMenu>> loadSysMenuList() {List<SysMenu> list = sysMenuService.list();return ResponseEntity.ok(list);}}

其中:
1、创建一个vo.MenuAndAuth类:
(用于返回菜单和权限的集合对象)

package com.powernode.vo;import com.powernode.domain.SysMenu;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel("菜单和权限对象")
public class MenuAndAuth {@ApiModelProperty("菜单集合")private List<SysMenu> menuList;@ApiModelProperty("权限集合")private List<String> authorities;}

2、前端代码,响应的数据属性名,也要和后端封装返回的菜单和权限属性名相同:

3、封装获取用户标识工具类:

package com.powernode.utils;import org.springframework.security.core.context.SecurityContextHolder;public class AuthUtil {public static String getLoginUserId() {return SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString();}
}

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

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

相关文章

求Win11系统virtualbox+vagrant安装MacOS虚拟机

文章目录 一、背景二、素材2.1、virtualboxvagrant 三、问题3.1、安装失败3.2、第二个失败3.3、网络说 四、求助 一、背景 题主&#xff0c;主要是穷&#xff0c;没钱买mac笔记本或相关系统的苹果产品&#xff0c;哈哈&#xff0c;偶尔也有用过MacOS系统&#xff0c;只是还没有…

【linuxwindows基础操作】如何一键下载 各个版本的python库文件

1. 把需要下载的库名字&版本号&#xff0c;存在.txt文件中 2. 输入命令执行&#xff0c;下载 pip install -r your_file_name该命令的作用是从指定的文本文件中安装 Python 依赖库。 在这个命令中&#xff0c;-r 参数表示从一个文本文件&#xff08;通常以 .txt 结尾&…

CSS3:图片边框

简介 图片也可以作为边框&#xff0c;以下是实例演示 注意 实现该效果必须添加border样式&#xff0c;且必须位于border-image-socure之前否则不会生效 实例 <html lang"en"><head><style>p {width: 600px;margin: 200px auto;border: 30px soli…

matlab使用教程(12)—随机数种子和随机数流

1.生成可重复的随机数 1.1指定种子 本示例显示如何通过首先指定种子来重复生成随机数数组。每次使用相同种子初始化生成器时&#xff0c;始终都可以获得相同的结果。首先&#xff0c;初始化随机数生成器&#xff0c;以使本示例中的结果具备可重复性。 rng( default ); 现在…

【JAVA】集合(Collection、Map)

集合和数组都是容器 数组&#xff1a;类型确定&#xff0c;长度固定&#xff0c;可以存储基本类型和引用类型的数据 集合&#xff1a;类型可以不固定&#xff0c;大小可变&#xff0c;只能存储引用数据类型的数据 Collection单列单列集合&#xff0c;每个元素只包含一个值Ma…

Node工程的依赖包管理方式

在前端工程化中&#xff0c;JavaScript 依赖包管理是非常重要的一环。依赖包通常是项目所依赖的第三方库、工具和框架等资源&#xff0c;它们能够帮助我们减少重复开发、提高效率并且确保项目可以正确的运行。 目前比较常见的前端包管理器有 npm 和 Yarn&#xff0c;npm 是 No…

Linux文件系统管理

Linux文件系统管理 磁盘的组成与分区 计算机用于存取文件的硬件是磁盘&#xff0c;磁盘的组成主要有磁盘盘、机械手臂、磁盘读取头与主轴马达所组成&#xff0c; 而数据的写入其实是在磁盘盘上面。磁盘盘上面又可细分出扇区(Sector)与磁道(Track)两种单位&#xff0c; 其中扇区…

浅谈JVM中的即时编译器(Just-In-Time compiler, JIT)

Java虚拟机&#xff08;JVM&#xff09;中的即时编译器&#xff08;Just-In-Time compiler, JIT&#xff09;是一个非常重要的组件&#xff0c;它负责将字节码转换为本地机器代码。在不使用JIT的情况下&#xff0c;JVM通过解释字节码来执行程序&#xff0c;这意味着它会为每个字…

C++RAII内存管理技术

文章目录 一.什么是RAII内存管理技术&#xff1f;二.智能指针unique_ptrshared_ptr循环引用问题weak_ptr 一.什么是RAII内存管理技术&#xff1f; C在引入异常机制后,代码执行流的跳转变得难以预料,如果使用普通的指针进行内存管理,很难避免内存泄漏的问题(执行流跳转导致堆区…

Linux文件属性查看和修改学习

一、基本属性 1、看懂文件属性&#xff1a; Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c; Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的…

无脑入门pytorch系列(三)—— nn.Linear

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

【Vue前端】设置标题用于SEO优化

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 1.vue全局配置2.创建并暴露getPageTitle方法3.通过全局前置守卫设置title4.页面上引用title5.项目使用中英文翻译&#xff0c;title失效 1.vu…