cloud_mall-notes01

news2024/11/26 11:27:46

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 {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 代码方式的路由存储token
     *
     * @param builder
     * @return
     */
    @Bean
    public 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_token
                            if (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 {

    @Autowired
    private 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.coloradmin.cn/o/881342.html

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

相关文章

考研 408 | 【计算机网络】 应用层

导图 网络应用模型 客户/服务器&#xff08;c/s&#xff09;模型 P2P模型 DNS 域名 域名服务器 域名解析过程 文件传输协议FTP FTP服务器和用户端 FTP工作原理 电子邮件 电子邮件的信息格式 组成结构 邮件服务器的功能&#xff1a; 1.发送&接收邮件 2.给发件人报告邮…

互联网用户激增,IP地址短缺怎么办?

IP地址是互联网上设备的唯一标识符&#xff0c;它使设备能够相互通信和交换数据。无论是电脑、手机还是其他连接到网络的设备&#xff0c;都需要一个IP地址才能与其他设备进行通信。 但随着互联网的快速发展和用户数量的增加&#xff0c;IP地址资源变得越来越紧缺。许多国家已经…

世界知名9大学习模型,高效自我提升之道

很多人觉得学习很难&#xff0c;遗忘很快&#xff0c;我们也从小就听家长老师说要掌握高效的学习方法和养成良好的学习习惯&#xff0c;那到底什么样的学习方法和学习习惯才是好的呢&#xff1f;本文结合高效在线学习工具boardmix博思白板为大家分享9大经典高效学习模型&#x…

Springboot 在 redis 中使用 Guava 布隆过滤器机制

一、导入SpringBoot依赖 在pom.xml文件中&#xff0c;引入Spring Boot和Redis相关依赖 <!-- Google Guava 使用google的guava布隆过滤器实现--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><vers…

【vue】vue中的插槽以及使用方法

插槽 普通插槽 1、在父组件中直接调用子组件的标签&#xff0c;是可以渲染出子组件的内容&#xff1b;如果在子组件标签中添加了内容&#xff0c;父组件就渲染不出来了&#xff1b; ParentComponent.vue&#xff1a; <template><div><h1>Parent Componen…

SciencePub学术| 智能计量类重点SCIE征稿中

SciencePub学术 刊源推荐: 智能计量类重点SCIE征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 智能计量类重点SCIE 【期刊简介】IF&#xff1a;2.0-2.5&#xff0c;JCR3区&#xff0c;中科院4区&#xff1b; 【版面类型】正刊&#…

【Linux技术专题】「必备基础知识」带你仔细梳理一下平时排查问题查询日志的基本操作和指令

带你仔细梳理一下平时排查问题查询日志的基本操作和指令 Linux文件与目录管理文件目录相对路径与绝对路径目录的相关操作标识符- 代表前一个工作目录。示例 ~ 代表当前用户的主文件夹。示例 可执行文件路径的变量&#xff1a; $PATH示例注意说明 文件内容查阅文件内容检索/截取…

opencv进阶03-图像与鼠标的交互示例

在处理图像时&#xff0c;可能需要与当前正在处理的图像进行交互。OpenCV 提供了鼠标事件&#xff0c;使用户可以通过鼠标与图像交互。鼠标事件能够识别常用的鼠标操作&#xff0c;例如&#xff1a;针对不同按键的单击、双击&#xff0c;鼠标的滑动、拖曳等。 例如&#xff0c;…

CentOS防火墙操作:开启端口、开启、关闭、配置

一、基本使用 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁用 &#xff1a; systemctl disable firewalld 开机启用 &#xff1a; systemctl enable firewalld systemctl是…

iptables之iptables表、链、规则 、匹配模式、扩展模块、连接追踪模块(一)

一、iptables的链 1.请求到达本机&#xff1a; PREROUTING --> INPUT --> Local Process &#xff08;本机&#xff09; 2.请求经过本机&#xff1a; PREROUTING --> FORWARD --> POSTROUTING 3.请求从本机发出&#xff1a;local Process&#xff08;本机&#xf…

计算机竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬虫与协同过滤的新闻推荐系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&…

ReactDOM模块react-dom/client没有默认导出报错解决办法

import ReactDOM 模块“"E:/Dpandata/Shbank/rt-pro/node_modules/.pnpm/registry.npmmirror.comtypesreact-dom18.2.7/node_modules/types/react-dom/client"”没有默认导出。 解决办法 只需要在tsconfig.json里面添加配置 "esModuleInterop": true 即…

无涯教程-Perl - setpwent函数

描述 此功能将枚举设置(或重置)到密码条目集的开头。应该在第一次调用getpwent之前调用此函数。 语法 以下是此函数的简单语法- setpwent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $passwd, $uid, $gid, $quota, …

Makefile多个子文件夹

首先&#xff0c;目录结构&#xff1a; 其中根目录Makefile主要作用是调用其他子文件夹Makefile&#xff0c;每个子模块执行各自编译后在build文件夹下生成obj文件&#xff0c;最后再执行build文件夹下Makefile进行链接。 根目录Makefile&#xff1a; TARGET ACT_Drv ##SRC_D…

java:JDBC

文章目录 什么是JDBCJDBC使用步骤详解各个对象DriverManagerConnectionStatementResultSetPreparedStatement JDBC控制事务操作步骤示例 什么是JDBC 我们知道&#xff0c;数据库有很多种&#xff0c;比如 mysql&#xff0c;Oracle&#xff0c;DB2等等&#xff0c;如果每一种数…

Python运算符全解析:技巧与案例探究

在Python编程中&#xff0c;运算符是强大的工具&#xff0c;能够使我们在数据处理和逻辑判断方面更加灵活。本篇博客将全面探讨Python中常用的运算符&#xff0c;包括算术、比较、逻辑、赋值、位、成员和身份运算符&#xff0c;通过实际案例为你展示如何妙用运算符解决问题。 …

java中的同步工具类CountDownLatch

这篇文章主要讲解java中一个比较常用的同步工具类CountDownLatch&#xff0c;不管是在工作还是面试中都比较常见。我们将通过案例来进行讲解分析。 一、定义 CountDownLatch的作用很简单&#xff0c;就是一个或者一组线程在开始执行操作之前&#xff0c;必须要等到其他线程执…

gitee(码云)如何生成并添加公钥,以及配置用户信息

一&#xff0c;简介 在使用Gitee的时候&#xff0c;公钥是必须的&#xff0c;无论是克隆还是上传。本文主要介绍如何本地生成和添加公钥到服务器&#xff0c;然后配置自己的用户信息&#xff0c;方便日后拉取与上传代码。 二&#xff0c;步骤介绍 2.1 本地生成公钥 打开git ba…

2023牛客暑期多校训练营9-J Puzzle: Star Battle

2023牛客暑期多校训练营9-J Puzzle: Star Battle https://ac.nowcoder.com/acm/contest/57363/J 文章目录 2023牛客暑期多校训练营9-J Puzzle: Star Battle题意解题思路代码 题意 解题思路 出题人都说是诈骗题&#xff08;&#xff0c;可以发现满足每行每列恰好有 n n n个星…

Mysql复制类型、主从复制集群种类、主从复制原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 主从复制原理主从复制原理图一、概述二、为什么要读写分离&#xff1f;三、mysql支持的复制类型1、基于语句的复制statement&#xff1a;2、基于行的复制row&#x…