账号+密码+图片验证码认证

news2024/11/24 12:21:41

账号+密码+图片验证码认证

实现步骤

实现账号密码认证,执行流程如下

在这里插入图片描述

第一步: 对于验证码服务工程的生成验证码图片的接口在网关处需要放行,否则页面无法获取生成的验证码图片

/**=临时放行所有请求
/auth/**=认证服务地址
/content/open/**=内容管理公开访问文件接口
/media/open/**=媒资管理公开访问接口

第二步: 在认证服务工程中定义远程调用验证码服务的Feign接口,并在启动类上添加@EnableFeignClients注解

  • 用户输入的验证码后会连同服务端响应的key会一同先提交至认证服务, 然后认证服务携带key和输入的验证码请求验证码服务工程的校验接口
package com.xuecheng.ucenter.feignclient;
@FeignClient(value = "checkcode",fallbackFactory = CheckCodeClientFactory.class)
@RequestMapping("/checkcode")
public interface CheckCodeClient {
    @PostMapping(value = "/verify")
    public Boolean verify(@RequestParam("key") String key,@RequestParam("code") String code);

}

// 编写熔断降级策略
@Slf4j
@Component
public class CheckCodeClientFactory implements FallbackFactory<CheckCodeClient> {
    @Override
    public CheckCodeClient create(Throwable throwable) {
        return new CheckCodeClient() {
            @Override
            public Boolean verify(String key, String code) {
                log.debug("调用验证码服务熔断异常:{}", throwable.getMessage());
                return null;
            }
        };
    }
}
// 扫描交了@FeignClient注解的类
EnableFeignClients(basePackages = "com.xuecheng.ucenter.feignclient")
    @SpringBootApplication
    public class AuthApplication {
        public static void main(String[] args) {
            SpringApplication.run(AuthApplication.class, args);
        }

        @Bean
        RestTemplate restTemplate(){
            RestTemplate restTemplate = new RestTemplate(new OkHttp3ClientHttpRequestFactory());
            return  restTemplate;
        }

    }

第三步: 引入Feign在Nacos的dev环境下的配置文件

spring:
  application:
    name: auth-service
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: dev402
        group: xuecheng-plus-project
      config:
        namespace: dev402
        group: xuecheng-plus-project
        file-extension: yaml
        refresh-enabled: true
        shared-configs:
          - data-id: swagger-${spring.profiles.active}.yaml
            group: xuecheng-plus-common
            refresh: true
          - data-id: logging-${spring.profiles.active}.yaml
            group: xuecheng-plus-common
            refresh: true
            # 引入Feign在Nacos的dev环境下的配置文件
          - data-id: feign-${spring.profiles.active}.yaml
            group: xuecheng-plus-common
            refresh: true

  profiles:
    active: dev

第四步: 在PasswordAuthServiceImpl中增加校验验证码校验密码的判断逻辑

/**
 * 认证Service
 */
public interface AuthService {
    /**
     * 认证方法
     * @param authParamsDto 认证参数
     * @return  用户信息
     */
    XcUserExt execute(AuthParamsDto authParamsDto);
}
@Service("password_authservice")
public class PasswordAuthServiceImpl implements AuthService {
    @Autowired
    XcUserMapper xcUserMapper;
    @Autowired
    PasswordEncoder passwordEncoder;
    @Autowired
    CheckCodeClient checkCodeClient;

    @Override
    public XcUserExt execute(AuthParamsDto authParamsDto) {
        // 获取用户提交的验证码
        String checkcode = authParamsDto.getCheckcode();
        // 获取验证码的key
        String checkcodekey = authParamsDto.getCheckcodekey();
        if (StringUtils.isBlank(checkcode) || StringUtils.isBlank(checkcodekey)){
            throw new RuntimeException("验证码为空");
        }
        // 首先远程调用验证码服务工程的接口校验验证码的正确性
        Boolean verify = checkCodeClient.verify(checkcodekey, checkcode);
        // 验证码输入错误
        if (!verify){
            throw new RuntimeException("验证码输入错误");
        }
        // 验证码正确,获取登陆账号相关信息
        String username = authParamsDto.getUsername();
        // 根据账号去数据库中查询用户是否存在
        XcUser xcUser = xcUserMapper.selectOne(new LambdaQueryWrapper<XcUser>().eq(XcUser::getUsername, username));
        // 用户不存在抛异常
        if (xcUser == null) {
            throw new RuntimeException("账号不存在");
        }
        // 用户存在,获取用户输入的密码
        String passwordForm = authParamsDto.getPassword();
        // 获取数据库中存储的用户密码
        String passwordDb = xcUser.getPassword();
        // 比较密码
        boolean matches = passwordEncoder.matches(passwordForm, passwordDb);
        // 密码不匹配抛异常
        if (!matches) {
            throw new RuntimeException("账号或密码错误");
        }
        // 密码匹配将查询得到的xcUser对象中的数据封装到扩展的xcUserExt对象中并返回
        XcUserExt xcUserExt = new XcUserExt();
        BeanUtils.copyProperties(xcUser, xcUserExt);
        return xcUserExt;
    }
}

HttpClient测试

重启认证服务,测试申请令牌接口注意JSON数据中要带上authType

# 密码模式,账号密码正确,可以成功获取authType,并正确查询到用户信息
POST localhost:53070/auth/oauth/token?client_id=XcWebApp&client_secret=XcWebApp&grant_type=password&username={"username":"yunqing","password":"111111","checkcode":"ZEUY","checkcodekey":"checkcodepre","authType":"password"}

前后端联调

第一步: 使用浏览器访问http://www.51xuecheng.cn/sign.html
在这里插入图片描述

第二步: 如果验证码和密码均正确在右上角可以看到登录的用户信息,并且前端也会把服务端响应的jwt令牌存储在cookie中,若设置不成功先清一下浏览器的缓存

  • 自动登录: 勾选自动登录cookie生成时间为30天,不勾选关闭浏览器窗口后就会自动删除cookie

在这里插入图片描述

// 在控制台手动设置cookie
document.cookie = "jwt=令牌内容"

// 前端设置cookie的代码
login(){
    //转json串
    let usernameJson = JSON.stringify(this.usernamejson)
    console.log(usernameJson)
    this.formdata.username = usernameJson;
    let params = querystringify(this.formdata);
    loginSubmit(params).then(res=>{
        console.log(res)                    // 控制台输出正常
        console.log(res.access_token)       // 控制台输出正常
        if(res&& res.access_token){
            console.log("进入到设置cookie之前")             // 控制台输出正常
            setCookie("jwt","123",30);                      // 无效
            if(this.autologin){
                setCookie('jwt',res.access_token,30)
            }else{
                console.log("进入到setCookie方法上面")     // 控制台输出正常
                setCookie('jwt',"123",0)                    // 无效
            }
            this.$message.success('登录成功')
            if(this.returnUrl){
                top.location=this.returnUrl
            }else{
                top.location='/'
            }
            
        }
    }).catch(error=>{
    if(error&&error.response&&error.response.data&&error.response.data.error_description){
        this.$message.error(error.response.data.error_description)
    }
    this.getCheckCode();
    })
}
// 对应的setCookie方法
function setCookie(name,value,Days){
    if(Days==0){
        document.cookie = name + "="+ escape (value) + ";domain=localhost;expires=0;path=/" ;
    }else{
        var exp = new Date();
        exp.setTime(exp.getTime() + Days*24*60*60*1000);
        document.cookie = name + "="+ escape (value) + ";domain=localhost;expires=" + exp.toGMTString()+";path=/";
    }
}
// logout()调用setCookie方法手动删除设置的jwt令牌
function logout(){
    setCookie('jwt','',-1)
    window.location='/'
}

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

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

相关文章

【计算机视觉】Gaussian Splatting源码解读补充(二)

第一部分 目录 三、前向传播&#xff08;渲染&#xff09;&#xff1a;submodules/diff-gaussian-rasterization/cuda_rasterizer/forward.cu预备知识&#xff1a;CUDA编程基础 三、前向传播&#xff08;渲染&#xff09;&#xff1a;submodules/diff-gaussian-rasterization/c…

软件工程导论画图题汇总:期末+复试

文章目录 一、数据模型&#xff1a;实体联系图&#xff08;E-R图&#xff09;二、行为模型&#xff1a;状态转换图三、功能模型&#xff1a;数据流图四、数据字典五、系统流程图六、层次图七、HIPO图八、结构图九、程序流程图十、盒图十一、PAD图十二、判定表、判定树 一、数据…

Vue2(四):Vue监测数据的原理

一、先来看一个问题 添加一个按钮点击更新马冬梅的信息&#xff1a; <button click"gengxin">点击更新马冬梅的信息</button> methods:{gengxin(){this.person[1].name马老师,this.person[1].age50,this.person[1].sex男}} 下面这种方式就不能奏效&a…

数据库系统概论-第5章 数据库完整性

5.1 实体完整性 5.2 参照完整性 5.3 用户定义完整性 5.4 完整性约束命名子句 5.5 域中的完整性限制 5.6 断言 5.7 触发器 5.8 小结

STM32CubeIDE基础学习-EXTI外部中断实验

STM32CubeIDE基础学习-EXTI外部中断实验 文章目录 STM32CubeIDE基础学习-EXTI外部中断实验前言第1章 硬件介绍第2章 工程配置2.1 工程外设配置部分2.2 生成工程代码部分 第3章 代码编写第4章 实验现象总结 前言 中断概念&#xff1a;让CPU打断正在执行的程序&#xff0c;进而去…

第8关:删除P表中所有的记录

任务描述 删除P表中所有的记录 相关知识 零件表P由零件代码&#xff08;PNO&#xff09;、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成&#xff1b; P表如下图&#xff1a; 现已构建P表&#xff0c;结构信息如下&#xff1a; 开始你的任务吧&#xff0c;祝你成功 USE my…

spring MVC是如何找到html文件并返回的?

Spring MVC 搜索路径 启动一个SpringBoot项目时&#xff0c;访问http://localhost:8080&#xff0c;对于SpringMVC&#xff0c;它会默认把这段url看成http://localhost:8080/index.html&#xff0c;所以这两个url是等价的。 .html, .css, .js, .img …都是静态资源文件&#x…

直播预约丨《袋鼠云大数据实操指南》No.1:从理论到实践,离线开发全流程解析

近年来&#xff0c;新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮&#xff0c;持续冲击并革新着企业数字化转型的观念视野&#xff0c;昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念&#xff0c;为了更好地服务于客户…

6.如何判断数据库搜索是否走索引?

判断是否使用索引搜索 索引在数据库中是一个不可或缺的存在&#xff0c;想让你的查询结果快准狠&#xff0c;还是需要索引的来帮忙&#xff0c;那么在mongo中如何判断搜索是不是走索引呢&#xff1f;通常使用执行计划&#xff08;解释计划、Explain Plan&#xff09;来查看查询…

Linux之缓冲区与C库IO函数简单模拟

缓冲区 首先, 我们对缓冲区最基本的理解, 是一块内存, 用户提供的缓冲区就是用户缓冲区, C标准库提供的就是C标准库提供的缓冲区, 操作系统提供的就是操作系统缓冲区, 它们都是一块内存. 为什么要有缓冲区? 先举个生活中的例子, 我们寄快递的时候往往是去驿站寄快递, 而不是…

Spring MVC文件下载配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 文件下载 在Spring MVC中通常利用commons-io实现文件下载&#xff0c;示例代码如下&#xff1a; Controller RequestMapping("......") public class DownloadC…

【晶振选型】输出波形的比较 CMOS Clipped sine wave TTL

疑问&#xff1a;哪种波形更好呢&#xff1f;答案是如果数字域方波最好&#xff0c;模拟域必须是正弦波了&#xff0c;所以还是具体问题具体分析。或者设计好冗余电路。 现在简单总结一下 晶振做的比较好的厂家 crystek 有一片被国内晶振厂家拿去分享的PDF; [CLIPPED SINEWA…

解决在命令行中输入py有效,输入python无效,输入python会跳转到microsoft store的问题| Bug

目录 如果你已经尝试过将python添加到系统变量在系统变量里把你自己的路径放到应用商店的路径之前删除windowsapps下的python.exe文件 如果你还未将python添加到系统变量没有python安装包且没有配置系统变量 如果你已经尝试过将python添加到系统变量 打开 运行&#xff0c;输入…

Linux CentOS 7.6安装Redis 6.2.6 详细保姆级教程

1、安装依赖 //检查是否有依赖 gcc -v //没有则安装 yum install -y gcc2、下载redis安装包 //进入home目录 cd /home //通过wget下载redis安装包 wget https://download.redis.io/releases/redis-6.2.6.tar.gz //解压安装包 tar -zxvf redis-6.2.6.tar.gz3、编译 //进入解压…

Prometheus修改默认数据存储时间

Prometheus的默认数据存储时间可以通过修改启动脚本中的相关参数来调整。具体来说&#xff0c;可以通过修改--storage.tsdb.retention.time参数来改变数据保留的时长。该参数决定了何时删除旧数据&#xff0c;默认为15天。如果需要延长数据保留时间&#xff0c;可以将该参数的值…

Day15:二叉树层序遍历 LeedCode 102.二叉树的层序遍历 199二叉树的右视图 637.二叉树的层平均值 101.对称二叉树 226.翻转二叉树

102.二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]思路…

汇丰:大宗商品的“供给侧大故事”

今年3月以来&#xff0c;黄金、铜、原油、可可等各类大宗商品价格开启“狂飙”模式。 国际黄金从每盎司2050美元涨至接近2200美元&#xff1b;作为全球经济晴雨表&#xff0c;伦铜价格已经突破9000美元/吨&#xff0c;创近1年新高&#xff1b;原油价格也连续上涨&#xff0c;I…

采用U盘安装Win10系统教程

安装流程&#xff1a; 下载 Windows 10https://www.microsoft.com/zh-cn/software-download/windows10 手把手教你如何重装win10系统&#xff0c;自己动手安装系统其实很简单 - 知乎笔者在这里写一个详细点的系统重装教程。手把手教大家如何从零开始重装win10系统。因为是写给新…

CPU设计实战-Wishbone总线接口

为什么需要改用总线接口&#xff1f; 1.但是在实际应用中&#xff0c;程序的体积可能非常大&#xff0c;指令存储器就不能再集成在FPGA内部了&#xff0c;一般使用FPGA芯片外部的Flash作为指令存储器。同理,-般使用FPGA芯片外部的SDRAM作为数据存储器。 2.统一接口标准。 很多…

科研学习|研究方法——实验法

1.实验方法的渊源 今天我们说物理学、生物学是实验的科学&#xff0c;应该不会有人再持异议了&#xff0c;然而连物理学这样的学科在历史上也并非一开始就是实验科学。在2000多年以前的亚里士多德时代&#xff0c;众人都认为物理学是非实验性质的&#xff0c;物理学成为实验科学…