当前位置: 首页 > news >正文

赤风设计网站/培训教育

赤风设计网站,培训教育,陕西建站公司,电子商务网站建设策划5.登录功能 通过最基础的登录操作来完成登录处理 登录页面处理 认证服务的处理 /*** 注册的方法* return*/PostMapping("/login")public String login(LoginVo loginVo , RedirectAttributes redirectAttributes){R r memberFeginService.login(loginVo);if(r.getC…

5.登录功能

  通过最基础的登录操作来完成登录处理

登录页面处理

image.png

认证服务的处理

/*** 注册的方法* @return*/@PostMapping("/login")public String login(LoginVo loginVo , RedirectAttributes redirectAttributes){R r = memberFeginService.login(loginVo);if(r.getCode() == 0){// 表示登录成功return "redirect:http://msb.mall.com/home";}redirectAttributes.addAttribute("errors",r.get("msg"));// 表示登录失败,重新跳转到登录页面return "redirect:http://msb.auth.com/login.html";}

会员中心的认证逻辑

@RequestMapping("/login")public R login(@RequestBody MemberLoginVO vo){MemberEntity entity = memberService.login(vo);if(entity != null){return R.ok();}return R.error(BizCodeEnume.USERNAME_PHONE_VALID_EXCEPTION.getCode(),BizCodeEnume.USERNAME_PHONE_VALID_EXCEPTION.getMsg());}

service中的具体认证处理

    @Overridepublic MemberEntity login(MemberLoginVO vo) {// 1.根据账号或者手机号来查询会员信息MemberEntity entity = this.getOne(new QueryWrapper<MemberEntity>().eq("username", vo.getUserName()).or().eq("mobile", vo.getUserName()));if(entity != null){// 2.如果账号或者手机号存在 然后根据密码加密后的校验来判断是否登录成功BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();boolean matches = encoder.matches(vo.getPassword(), entity.getPassword());if(matches){// 表明登录成功return entity;}}return null;}

6.Auth2.0

  OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth
2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。

image.png

6.1 微博开放平台

地址:https://open.weibo.com/

image.png

创建应用

image.png

image.png

创建后的基本信息:

image.png

授权设置:

image.png

社交认证文档:

image.png

微博Web端授权的操作:

image.png

image.png

引导用户点击按钮跳转到对应的授权页面

image.png

image.png

点击授权按钮后查看回调接口的code信息

image.png

获取到了code信息:59d62e59e5ead5a4ea89c6f9cf212568

然后根据code信息我们可以去授权服务器获取对应的AccessToken。

https://api.weibo.com/oauth2/access_token?client_id=1093598037&client_secret=1085c8de04dee49e9bb110eaf2d3cf62&grant_type=authorization_code&redirect_uri=http://msb.auth.com/success.html&code=59d62e59e5ead5a4ea89c6f9cf212568

获取Token信息只支持POST方式提交

image.png

在PostMan中通过post方式提交成功获取到了对应的token信息

image.png

获取到了Token信息后我们就可以去资源服务器获取对象的信息

image.png

6.2 百度开放平台

地址:

Auth2.0操作:https://developer.baidu.com/wiki/index.php?title=docs/oauth

image.png

创建应用:http://developer.baidu.com/console#app/project

image.png

image.png

创建完成:

image.png

引导用户跳转到授权地址:

http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&scope=email&display=popup

地址修改为我们自己的:http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=MmvAkQM7HtrQnKDDhhmTSib5&redirect_uri=http://www.baidu.com&display=popup

image.png

获取到的Code信息

image.png

code:d789d0160b2fa99bb1f840002569526e

获取到对应的token信息

image.png

Token:121.6966ae0e0f3cd19fa36a375489342b08.YmfrSxYqsOt1eUoPzkC60yCsa7W09OmqTbPsuVL.zmdMFg

token访问地址:https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser?access_token=121.6966ae0e0f3cd19fa36a375489342b08.YmfrSxYqsOt1eUoPzkC60yCsa7W09OmqTbPsuVL.zmdMFg

image.png

7.社交登录实现

7.1 code处理

  在后台服务中获取code并对应的获取Token信息

image.png

image.png

然后需要同步的调整引入的链接地址:

image.png

7.2 获取Token信息

  根据上一步获取的code信息,我们可以获取对应的Token信息

    @RequestMapping("/oauth/weibo/success")public String weiboOAuth(@RequestParam("code") String code) throws Exception {Map<String,String> body = new HashMap<>();body.put("client_id","1093598037");body.put("client_secret","1085c8de04dee49e9bb110eaf2d3cf62");body.put("grant_type","authorization_code");body.put("redirect_uri","http://msb.auth.com/oauth/weibo/success");body.put("code",code);// 根据Code获取对应的Token信息HttpResponse post = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<>(), null, body);int statusCode = post.getStatusLine().getStatusCode();if(statusCode != 200){// 说明获取Token失败,就调回到登录页面return "redirect:http://msb.auth.com/login.html";}// 说明获取Token信息成功String json = EntityUtils.toString(post.getEntity());SocialUser socialUser = JSON.parseObject(json, SocialUser.class);// 注册成功就需要调整到商城的首页return "redirect:http://msb.mall.com/home.html";}

7.3 登录和注册

  表结构中新增对应的

image.png

然后在对应的实体对象中添加对应的属性

image.png

service中实现注册和登录的逻辑

    /*** 社交登录* @param vo* @return*/@Overridepublic MemberEntity login(SocialUser vo) {String uid = vo.getUid();// 如果该用户是第一次社交登录,那么需要注册// 如果不是第一次社交登录 那么就更新相关信息 登录功能MemberEntity memberEntity = this.getOne(new QueryWrapper<MemberEntity>().eq("social_uid", uid));if(memberEntity != null){// 说明当前用户已经注册过了 更新token和过期时间MemberEntity entity = new MemberEntity();entity.setId(memberEntity.getId());entity.setAccessToken(vo.getAccessToken());entity.setExpiresIn(vo.getExpiresIn());this.updateById(entity);// 在返回的登录用户信息中我们同步的也保存 token和过期时间memberEntity.setAccessToken(vo.getAccessToken());memberEntity.setExpiresIn(vo.getExpiresIn());return memberEntity;}// 表示用户是第一提交,那么我们就需要对应的来注册MemberEntity entity = new MemberEntity();entity.setAccessToken(vo.getAccessToken());entity.setExpiresIn(vo.getExpiresIn());entity.setSocialUid(vo.getUid());// 通过token调用微博开发的接口来获取用户的相关信息try {Map<String,String> querys = new HashMap<>();querys.put("access_token",vo.getAccessToken());querys.put("uid",vo.getUid());HttpResponse response = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<>(), querys);if(response.getStatusLine().getStatusCode() == 200){String json = EntityUtils.toString(response.getEntity());JSONObject jsonObject = JSON.parseObject(json);String nickName = jsonObject.getString("screen_name");String gender = jsonObject.getString("gender");entity.setNickname(nickName);entity.setGender("m".equals(gender)?1:0);}}catch (Exception e){}// 注册用户信息this.save(entity);return entity;}

7.4 登录的串联

在Auth服务中我们需要通过Feign来调用MemberService中的相关服务来完成最后的串联

    @RequestMapping("/oauth/weibo/success")public String weiboOAuth(@RequestParam("code") String code) throws Exception {Map<String,String> body = new HashMap<>();body.put("client_id","1093598037");body.put("client_secret","1085c8de04dee49e9bb110eaf2d3cf62");body.put("grant_type","authorization_code");body.put("redirect_uri","http://msb.auth.com/oauth/weibo/success");body.put("code",code);// 根据Code获取对应的Token信息HttpResponse post = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<>(), null, body);int statusCode = post.getStatusLine().getStatusCode();if(statusCode != 200){// 说明获取Token失败,就调回到登录页面return "redirect:http://msb.auth.com/login.html";}// 说明获取Token信息成功String json = EntityUtils.toString(post.getEntity());SocialUser socialUser = JSON.parseObject(json, SocialUser.class);R r = memberFeginService.socialLogin(socialUser);if(r.getCode() != 0){// 登录错误return "redirect:http://msb.auth.com/login.html";}String entityJson = (String) r.get("entity");System.out.println("----------------->" + entityJson);// 注册成功就需要调整到商城的首页return "redirect:http://msb.mall.com/home";}

二、分布式session

1.session问题

image.png

image.png

image.png

image.png

image.png

image.png

2.SpringSession整合

  我们通过SpringSession来实现Session的共享,Session数据存储在Redis中

image.png

SpringSession的操作指南:

https://docs.spring.io/spring-session/docs/2.5.6/reference/html5/guides/boot-redis.html

导入相关的依赖

        <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>

设置对应的配置

image.png

最后我们需要添加对有的注解,放开操作

image.png

然后在Auth服务和商城首页都整合SpringSession后,我们再商城首页可以看到Session的数据,注意这儿是手动修改Cookie的域名

image.png

image.png

3.自定义Cookie

  通过自定义Cookie实现session域名的调整

@Configuration
public class MySessionConfig {/*** 自定义Cookie的配置* @return*/@Beanpublic CookieSerializer cookieSerializer(){DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();cookieSerializer.setDomainName("msb.com"); // 设置session对应的一级域名cookieSerializer.setCookieName("msbsession");return cookieSerializer;}/*** 对存储在Redis中的数据指定序列化的方式* @return*/@Beanpublic RedisSerializer<Object> redisSerializer(){return new GenericJackson2JsonRedisSerializer();}
}

4.单点登录案例演示

  xxl-sso案例代码地址:https://gitee.com/xuxueli0323/xxl-sso?_from=gitee_search

下载下来的代码解压缩后通过idea导入,然后修改server和simple中的属性文件,同时我们需要在host中设置对应的域名

127.0.0.1 ssoserver.com
127.0.0.1 msb1.com
127.0.0.1 msb2.com

在server的配置文件中,修改Redis的服务地址

image.png

然后在simple中修改server的地址和redis服务的地址

image.png

然后分别启动服务测试即可

image.png

相关文章:

【业务功能篇96】微服务-springcloud-springboot-认证服务-登录注册功能-Auth2.0-分布式session

5.登录功能 通过最基础的登录操作来完成登录处理 登录页面处理 认证服务的处理 /*** 注册的方法* return*/PostMapping("/login")public String login(LoginVo loginVo , RedirectAttributes redirectAttributes){R r memberFeginService.login(loginVo);if(r.getC…...

自造简易版音频进度条

最近在做音乐播放器页面, 积累了很多有趣的经验, 今天先分享播放进度条的开发过程. 效果 话不多说&#xff0c;先看效果 支持点击修改进度&#xff0c;拖拽修改进度&#xff0c;当然大家肯定都知道ui库里面有现成的&#xff0c;为何要自己造一个 首先著名的ui库中确实都要这…...

433MHz芯片在遥控应用市场中的优点

当涉及到简单的无线射频通信&#xff0c;433MHz芯片成为一种经济实惠且广泛应用的选择。以下是关于433MHz芯片的重点信息&#xff1a; 工作原理&#xff1a;433MHz芯片的工作原理是将数字信号转化为射频信号&#xff0c;并通过无线信道进行传输。在接收端&#xff0c;射频信号再…...

基于Bert+Attention+LSTM智能校园知识图谱问答推荐系统——NLP自然语言处理算法应用(含Python全部工程源码及训练模型)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境服务器环境 模块实现1. 构造数据集2. 识别网络3. 命名实体纠错4. 检索问题类别5. 查询结果 系统测试1. 命名实体识别网络测试2. 知识图谱问答系统整体测试 工程源代码下载其它资料下载 前言 这个项目充分利用了…...

慕尼黑主题活动!亚马逊云科技生成式AI全新解决方案,引领未来移动出行领域

IAA作为世界五大车展之一&#xff0c;一直对全球汽车产业的发展起着关键作用&#xff01;2023年9月5日在慕尼黑开幕的IAA MOBILITY 2023以“体验联动智慧出行”为主题&#xff0c;紧跟移动出行领域的前沿变化&#xff0c;将汇集整车企业、开发者、供应商、科技公司、服务提供商…...

android 离线语言合成(文字转语音)

1、基于开源MaryTTS https://github.com/AndroidMaryTTS/AndroidMaryTTS 目前查到的资料&#xff0c;不支持中文&#xff0c;只针对西方语种。 2、基于TensorFlowTTS 官方个地址&#xff1a;为 Android 构建 TensorFlow Lite 库 (google.cn) 所依赖包下载地址:Maven Centr…...

使用Fastchat部署vicuna大模型

FastChat是一个用于训练、提供服务和评估基于大型语言模型的聊天机器人的开放平台。其核心特点包括&#xff1a; 最先进模型&#xff08;例如 Vicuna&#xff09;的权重、训练代码和评估代码。一个分布式的多模型提供服务系统&#xff0c;配备 Web 用户界面和与 OpenAI 兼容的…...

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 问题分析、数学模型及python代码实现

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 1 题目 C题蔬菜类商品的自动定价与补货决策 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&…...

华为云云耀云服务器L实例评测|华为云云耀云服务器L实例评测使用

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…...

【DS思想+堆贪心】CF595div3 D2

Problem - D2 - Codeforces 题意&#xff1a; 思路&#xff1a; 大家都说这是典&#xff0c;但是我不懂怎么个典法&#xff0c;可能堆贪心都是这样做的吗&#xff0c;不懂 首先肯定要贪心&#xff0c;对于一个坏点&#xff0c;优先删除覆盖别的点多的 考虑nlogn做法&#x…...

2023-09-08 LeetCode每日一题(计算列车到站时间)

2023-09-08每日一题 一、题目编号 2651. 计算列车到站时间二、题目链接 点击跳转到题目位置 三、题目描述 给你一个正整数 arrivalTime 表示列车正点到站的时间&#xff08;单位&#xff1a;小时&#xff09;&#xff0c;另给你一个正整数 delayedTime 表示列车延误的小时…...

软考-高级-信息系统项目管理第四版(完整24章全笔记)

《信息系统项目管理师教程》&#xff08;第4版&#xff09;是由全国计算机专业技术资格考试办公室组织编写的考试用书&#xff0c;根据2022年审定通过的《信息系统项目管理师考试大纲》编写&#xff0c;对信息系统项目管理师岗位所要求的主要知识及应用技术进行了阐述。 《信息…...

华为Mate 60和iPhone 15选哪个?

最近也有很多朋友问我这个问题来着&#xff0c;首先两款手机定位都是高端机&#xff0c;性能和体验各有千秋&#xff0c;各自有自己的铁杆粉。 但是让人意想不到的是华为mate60近日在海外越来越受欢迎和追捧&#xff0c;甚至是引起了不少人的抢购&#xff0c;外观设计和…...

嵌入式Linux驱动开发(同步与互斥专题)(二)

一、自旋锁spinlock的实现 自旋锁&#xff0c;顾名思义&#xff1a;自己在原地打转&#xff0c;等待资源可用&#xff0c;一旦可用就上锁霸占它。 ① 原地打转的是CPU x&#xff0c;以后CPU y会解锁&#xff1a;这涉及多个CPU&#xff0c;适用于SMP系统&#xff1b; ② 对于单…...

Docker安装部署Nexus3作为内网镜像代理缓存容器镜像

Docker安装部署Nexus3作为内网镜像代理 一、背景描述 基础镜像比较小&#xff0c;仓库使用阿里云或者腾讯云拉取速度挺快&#xff0c;但是时光飞逝几年时间过去&#xff0c;再加上AI加持的情况下&#xff0c;有些镜像的大小已经接近20G&#xff01; 这种情况下不管是测试环境…...

SpringBoot工具库:解决SpringBoot2.*版本跨域问题

1.解决问题&#xff1a;When allowCredentials is true, xxxxxxx , using “allowedOriginPatterns“ instead 2.3版本跨域配置如下 /*** 跨域问题解决*/ Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegi…...

docker安装开发常用软件MySQL,Redis,rabbitMQ

Docker安装 docker官网&#xff1a;Docker: Accelerated Container Application Development docker镜像仓库&#xff1a;https://hub.docker.com/search?qnginx 官网的安装教程&#xff1a;Install Docker Engine on CentOS | Docker Docs 安装步骤 1、卸载以前安装的doc…...

C# Unity FSM 状态机

C# Unity FSM 状态机 使用状态机可以降低代码耦合性&#xff0c;并且可以优化代码可读性&#xff0c;方便团队协作等。 对于游戏开发内容来讲游戏开发的流程控制玩家动画都可以使用FSM有限状态机来实现。 1.FsmState 每个状态的基类&#xff0c;泛型参数表示所拥有者 publi…...

pytorch搭建squeezenet网络的整套工程,及其转tensorrt进行cuda加速

本来&#xff0c;前辈们用caffe搭建了一个squeezenet的工程&#xff0c;用起来也还行&#xff0c;但考虑到caffe的停更后续转trt应用在工程上时可能会有版本的问题所以搭建了一个pytorch版本的。 以下的环境搭建不再细说&#xff0c;主要就是pyorch&#xff0c;其余的需要什么p…...

【精读Uboot】SPL阶段的board_init_r详细分析

对于i.MX平台上的SPL来说&#xff0c;其不会直接跳转到Uboot&#xff0c;而是在SPL阶段借助BOOTROM跳转到ATF&#xff0c;然后再通过ATF跳转到Uboot。 board_init_f会初始化设备相关的硬件&#xff0c;最后进入board_init_r为镜像跳转做准备。下面是board_init_r调用的核心函数…...

canvas绘制渐变色三角形金字塔

项目需求:需要绘制渐变色三角形金字塔,并用折线添加标识 (其实所有直接用图片放上去也行,但是ui没切图,我也懒得找她要,正好也没啥事,直接自己用代码绘制算了,总结一句就是闲的) 最终效果如下图: (以上没用任何图片,都是代码绘制的) 在网上找了,有用canvas绘…...

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…...

Debain JDK8 安装

Debain JDK8 安装 首先请安装依赖&#xff1a; sudo apt-get update && sudo apt-get install -y wget apt-transport-https然后信任 GPG 公钥&#xff1a; wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/…...

Python序列操作指南:列表、字符串和元组的基本用法和操作

文章目录 序列列表创建列表访问元素修改元素添加和删除元素 range()字符串创建字符串访问字符字符串切片修改字符串 元组创建元组访问元素获取元素数量元组的特点&#xff1a; 可变对象改变对象的值改变变量的指向比较运算符总结 python精品专栏推荐python基础知识&#xff08;…...

【已更新代码图表】2023数学建模国赛E题python代码--黄河水沙监测数据分析

E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c;以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位于小浪底水…...

【前端】CSS-Grid网格布局

目录 一、grid布局是什么二、grid布局的属性三、容器属性1、display①、语句②、属性值 2、grid-template-columns属性、grid-template-rows属性①、定义②、属性值1&#xff09;、固定的列宽和行高2&#xff09;、repeat()函数3&#xff09;、auto-fill关键字4&#xff09;、f…...

计算机竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...

2023-9-8 求组合数(二)

题目链接&#xff1a;求组合数 II #include <iostream> #include <algorithm>using namespace std;typedef long long LL; const int mod 1e9 7; const int N 100010;// 阶乘&#xff0c;阶乘的逆 int fact[N], infact[N];LL qmi(int a, int k, int p) {int res…...

k8s service的一些特性

文章目录 Service分发负载的策略同一端口通过不同协议暴露Headless Service的负载分发策略 Service分发负载的策略 大家都知道&#xff0c;一个service可以对应多个pod&#xff0c;那么一定要有一些方法来把service接收到的请求&#xff08;负载&#xff09;转发到pod上。 一般…...

C++中std::enable_if和SFINAE介绍

作为一个标准的C++模板类,我们先看下enable_if的定义: // STRUCT TEMPLATE enable_if template <bool _Test, class _Ty = void> struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty> struct enable_if<true, _Ty> { //…...