【前端必备技能java之若依框架认证(登录注册)模块梳理】

这篇具有很好参考价值的文章主要介绍了【前端必备技能java之若依框架认证(登录注册)模块梳理】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


必备技能java系列梳理的文章并不涉及造轮子,以若依框架为基础,分析微服务Spring Cloud的能力,并理清微服务在业务处理上搭建的应用层架构,不会追问技术实践的底层细节,目标是可以让有后端经验的非java相关的程序员可以使用Spring Cloud搭建属于自己的后端服务

认证模块目录结构

若依的登录认证模块是什么,学java,前端,java,开发语言

上面的结构来自于若依认证模块仓库

  • src->main->java目录是SpringCloud项目在生成项目后的固定结构,
  • com.ruoyi.auth为项目自定义,包含了若依认证模块的业务实现,
    1、controller 为项目配置文件
    2、form为登录注册使用的数据对象
    3、service为网关的业务层实现
  • resources目录下为本地配置,
  • target为编译后的文件目录。

为什么需要认证模块

若依的登录认证模块是什么,学java,前端,java,开发语言
上面是若依的架构图,从上图可以看出当客户端发起Http请求之后,会首先进入网关,在网关这一层需要做认证处理,这里的认证包括生成Token,用户登录业务、用户注册业务、记录登录信息等。
实际上就是负责用户身份验证和授权,之所以会抽离为单独模块,是为了单独维护这一块的逻辑,方便后续的扩展比如集成第三方认证(OAuth验证),这种业务分割的方式也可以复用到其他类似的模块中。

控制器(controller)

Controller 负责处理用户的请求并调用后端代码(通常是服务层或业务逻辑层)来处理业务需求。看一下若依是如何在控制器中分发路由的。

@RestController
public class TokenController
{
    @Autowired
    private TokenService tokenService;
    @Autowired
    private SysLoginService sysLoginService;
    // R<?> 标明需要返回的数据格式
    @PostMapping("login")
    public R<?> login(@RequestBody LoginBody form)
    {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
        // 获取登录token
        return R.ok(tokenService.createToken(userInfo));
    }
    @DeleteMapping("logout")
    public R<?> logout(HttpServletRequest request)
    {
        String token = SecurityUtils.getToken(request);
        if (StringUtils.isNotEmpty(token))
        {
            String username = JwtUtils.getUserName(token);
            // 删除用户缓存记录
            AuthUtil.logoutByToken(token);
            // 记录用户退出日志
            sysLoginService.logout(username);
        }
        return R.ok();
    }
    @PostMapping("refresh")
    public R<?> refresh(HttpServletRequest request)
    {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser))
        {
            // 刷新令牌有效期
            tokenService.refreshToken(loginUser);
            return R.ok();
        }
        return R.ok();
    }
    @PostMapping("register")
    public R<?> register(@RequestBody RegisterBody registerBody)
    {
        // 用户注册
        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
        return R.ok();
    }
}

@RestController 注解表示生成resfull风格的路由,同时也表明该类是一个 Spring 的 Controller,可以处理 HTTP 请求。
@Autowired 注解表示自动注入依赖,也就是以类型的方式识别Bean,在当前的控制器中可以调用依赖中的方法。
@PostMapping(“login”) 用来处理Post类型的请求,匹配到login请求后进入对应的方法中。
***@DeleteMapping(“logout”)***用于处理 DELETE 类型的请求,匹配到logout请求后进入对应的方法中。

业务实现(Service)

登录业务

控制器中的login方法调用业务层(service)的具体实现,包括用户名密码校验IP地址校验用户信息校验登录日志记录等:
流程图如下:
若依的登录认证模块是什么,学java,前端,java,开发语言
业务层实现:

  public LoginUser login(String username, String password)
    {
        // 用户名或密码为空 错误
        if (StringUtils.isAnyBlank(username, password))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写");
            throw new ServiceException("用户/密码必须填写");
        }
        // 密码如果不在指定范围内 错误
        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户密码不在指定范围");
            throw new ServiceException("用户密码不在指定范围");
        }
        // 用户名不在指定范围内 错误
        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户名不在指定范围");
            throw new ServiceException("用户名不在指定范围");
        }
        // IP黑名单校验
        String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单");
            throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
        }
        // 查询用户信息
        R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);

        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData()))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
            throw new ServiceException("登录用户:" + username + " 不存在");
        }

        if (R.FAIL == userResult.getCode())
        {
            throw new ServiceException(userResult.getMsg());
        }
        LoginUser userInfo = userResult.getData();
        SysUser user = userResult.getData().getSysUser();
        if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
            throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
        }
        if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
            throw new ServiceException("对不起,您的账号:" + username + " 已停用");
        }
        passwordService.validate(user, password);
        recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
        return userInfo;
    }

注册业务

控制器中的register方法调用业务层(service)的具体实现,包括用户名密码校验用户是否已注册等:
流程图如下:
若依的登录认证模块是什么,学java,前端,java,开发语言
业务层实现:

  public void register(String username, String password)
    {
        // 用户名或密码为空 错误
        if (StringUtils.isAnyBlank(username, password))
        {
            throw new ServiceException("用户/密码必须填写");
        }
        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
        {
            throw new ServiceException("账户长度必须在2到20个字符之间");
        }
        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
        {
            throw new ServiceException("密码长度必须在5到20个字符之间");
        }

        // 注册用户信息
        SysUser sysUser = new SysUser();
        sysUser.setUserName(username);
        sysUser.setNickName(username);
        sysUser.setPassword(SecurityUtils.encryptPassword(password));
        R<?> registerResult = remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER);

        if (R.FAIL == registerResult.getCode())
        {
            throw new ServiceException(registerResult.getMsg());
        }
        recordLogService.recordLogininfor(username, Constants.REGISTER, "注册成功");
    }

上述就是若依的登录注册流程,这中间还涉及到一些通用的工具类,可自行参考若依工具类代码。文章来源地址https://www.toymoban.com/news/detail-838707.html

到了这里,关于【前端必备技能java之若依框架认证(登录注册)模块梳理】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端开发必备技能!用简单CSS代码绘制三角形,提升用户体验

        🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 ! 目录  ⭐  专栏简介  📘  文章引言 一、前言 二、实现过程 三、原理分析 ⭐  写在最后         欢

    2024年02月07日
    浏览(34)
  • 若依框架部署Linux访问报错,401认证失败,无法访问系统资源

    现象描述:若依框架搭建项目,本地测试前后端访问均正常,部署Linux服务器后,登录页面提示会话过期请重新登陆,重新登陆返回 401认证失败,无法访问系统资源 。 解决方案:修改Nginx配置文件,配置代理时 /prod-api/ 前后都要加斜线。  

    2024年02月16日
    浏览(44)
  • 学习若依框架----之----获取登录登录系统、ip、浏览器信息

    若依里面,创建登录日志是根据异步任务进行新增,设置的有一个延时任务,登录之后,创建登录日志。本文章是非异步任务新增。大概思路是:在登录、注册、退出登录完成返回之前,调用日志工具,进行新增日志操作。 备注: 重点是日志工具逻辑,先判断是不是内网,

    2023年04月15日
    浏览(80)
  • JavaScript Web APIs2(2),GitHub标星1w的前端架构师必备技能

    应用:tab 栏切换 H5自定义属性 自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。 自定义属性获取是通过getAttribute(‘属性’) 获取。 但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。 H5给我们新

    2024年04月09日
    浏览(36)
  • 基于若依框架的微信小程序登录

    一、用户表结构 二、用户实体类 三、登录时用到的SQL语句 四、微信用户登录验证 五、创建token令牌 六、登录接口涉及方法

    2024年02月11日
    浏览(30)
  • 结合若依框架实现微信小程序授权登录

    通过若依框架实现微信小程序的授权登录。 原视频链接: https://www.bilibili.com/video/BV1iM411E7RE/?spm_id_from=333.337.search-card.all.clickvd_source=c15794e732e28886fefab201ec9c6253 下载 ruoyi-vue 代码 https://gitee.com/y_project/RuoYi-Vue 下载 ruoyi-app 代码 https://gitee.com/y_project/RuoYi-App 流程图如下: app 模块配

    2023年04月25日
    浏览(27)
  • 若依vue(前后端分离版本)前端获取登录用户id

    1.找到user.js 2.在user.js中找到以下几个地方 属性:state{} 属性:mutations{} 函数:GetInfo() 3.在user.js中添加代码  4.在自己的页面中添加获取id的代码 在该若依的版本中,从下列目录找到,ruoyi-ui-src-store-modules-user.js 属性state在页面中的位置 还有mutations 最后是GetInfo方法 步骤三 到此

    2024年04月12日
    浏览(34)
  • 若依框架前端切换TagView时刷新问题

    若依框架点击顶部tag切换时,永远都是刷新的。刷新问题两种情况:普通view切换时刷新及iFrame切换刷新 一、普通view切换时刷新 原因是view的name与在菜单填写的大小写不一致,按若依框架规则,路由地址必须写为 camel 驼峰命名形式,组件名称必须写为 pascal 首字母全大写的形

    2024年01月15日
    浏览(45)
  • 若依框架前端静态资源到后端访问

    修改ruoyi-ui中的.env.production(二选一) 修改ruoyi-ui中的router/index.js,设置mode属性为hash 打包前端静态资源文件。 修改后端resources中的application.yml,添加thymeleaf模板引擎配置 修改后端pom.xml,增加thymeleaf模板引擎依赖 修改后端ResourcesConfig.java中的 addResourceHandlers,添加静态资源映

    2024年02月06日
    浏览(49)
  • 前端开发调式必备技能F12开发者工具之Elements(元素)面板,详细图解带流程【第一部分】

    目录 一、进入浏览器开发工具的几种方式 二、Elements(元素)面板  左侧区域 右侧区域  计算样式 事件监听器 大家好!我是爷爷的茶七里香,这个名字有没有让你想起周董的歌捏?好了,废话不多说,开始今天咱们的内容:         相必是个老手都知道按键盘上的f12就

    2023年04月13日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包