【ruoyi-vue-pro】用户相关的设计

简介

对于一个后端系统,最重要的就是用户。当拿到一个后端框架的时候,首先应该看看用户的设计,一个是作为开发来讲,平时接触最多的就是用户相关的业务,对用户再熟悉不过了;第二个是可以通过对用户的设计,管中窥豹,大致看看整个系统中,如何管理用户,比如用户的组织树对于权限或者业务有没有什么影响。

实体

后台管理用户

对应位置:cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO

对应表:system_users

看下里面的关键字段:

password:用来放置加密后的密码。

deptId:部门id,直接在这里设计,这样的话,一个用户只能对应一个部门id,如果有用户存在在两个不同部门里面任职的情况,就无法处理。

postIds:岗位编号,是个数组,说明可以任多个岗位。

status:状态,用户的相关状态。

用户和岗位

对应位置:cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO

对应表:system_user_post

这里有点奇怪,后台管理用户含有本实体的id字段,可能那边是冗余设计。

三方用户

对应位置:cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO

对应表:system_social_user

这是为了记录,比如从微信或者其他平台通过OAuth技术注册过来的用户。

openid是这里面重要的属性,用于记录微信或者其他平台给过来的id。

用户角色

对应位置:cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO

对应表:system_user_role

有这个表,说明不同的用户可以绑定不同的角色,这个框架是基于RBAC去设计的。

如果详细摸索下,可以发现role和menu也是绑定关系,哪些角色可以访问哪些菜单,就是通过这种绑定关系去确定的。

租户

对应位置:cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO

对应表:system_user_role

有这个概念,说明用户是可以归为一个独立集合的。比如划分一个公司。这样子。不同的公司里面的用户,是不会影响另一批公司的客户。这种划分概念一般出现在SAAS系统中。

登录设计

登录的设计老生常谈了,对于工作多年的人,应该都通过各种渠道学习过登录设计。所以,通过自己熟悉的点做切入,是非常容易的一件事,这样可以简单解决对于读一份后端框架代码不知道从何读起的困惑。迈过了这道坎,会对作者的代码风格有一定的认知,并且能简单地看懂他们的配置设计,对于后续掌握这个项目如何配置起到一定的关键作用。

系统内登录

我们先从系统内的登录入手,看看简单的登录如何实现。

验证码

首先是验证码设计。

对外接口放在cn.iocoder.yudao.module.system.controller.admin.captcha.CaptchaController里面。其中,/system/captcha/get接口用于提供图片给前端,图片内容为滑动图片,当然,前端可以通过captchaType参数指定验证码类型。 内部通过IP加user-agent为不同位置不同访问设备的用户生成一个图片验证码。

这个功能应该采用的是第三方的插件,Bean的配置在cn.iocoder.yudao.module.system.framework.captcha.config.YudaoCaptchaConfiguration

/system/captcha/check接口用于给前端校验验证码是否正确,校验成功会获得一个验证码,举个例子:PfcH6mgr8tpXuMWFjvW6YVaqrswIuwmWI5dsVZSg7sGpWtDCUbHuDEXl3cFB1+VvCC/rAkSwK8Fad52FSuncVg==。会在请求/login时传到后端,让后端校验。

如果对这块有深入研究的兴趣,可以去看看这个插件的项目,这里就不做过多解读了。

登录

登录首先要找到接口,接口可以通过swagger找到,即/system/auth/login。注意,这里面也会校验前面的验证码,如果验证码不正确,会记录登录日志。

其中还有社交登录的相关代码,这一部分可以以后再看。

最后是创建default客户端的OAuth2的访问令牌(token),这将返回信息给前端,前端缓存后,会在每个后续请求中携带token以证明自己的用户身份。后端将token保存在两个位置,一个是数据库,另一个是redis中。redis的key以oauth2_access_token:开头。redis的这个缓存会在前端接口校验中使用,用来确定用户信息。

安全校验

ruoyi-vue-peo使用的是Spring Sercurity作为安全框架,因此,它必须围绕这个框架做安全配置。配置Bean在代码cn.iocoder.yudao.framework.security.config.YudaoSecurityAutoConfiguration中。

这里面有个关键的Bean:

java 复制代码
/**
 * Token 认证过滤器 Bean
 */
@Bean
public TokenAuthenticationFilter authenticationTokenFilter(GlobalExceptionHandler globalExceptionHandler,
                                                           OAuth2TokenCommonApi oauth2TokenApi) {
    return new TokenAuthenticationFilter(securityProperties, globalExceptionHandler, oauth2TokenApi);
}

这个过滤器就是会用到登录Token以校验用户身份的地方。

进入这个过滤器的cn.iocoder.yudao.framework.security.core.filter.TokenAuthenticationFilter#doFilterInternal方法中。

过滤器的逻辑:

  1. 通过请求地址的前缀,匹配是哪一类用户的访问(getLoginUserType方法),后台管理用户是/admin-api,会员用户是/app-api

  2. 根据用户类型和token,构建登录用户的信息(buildLoginUserByToken方法),缓存在后端系统中,供后续操作调用。

  3. 先从redis获取token对应的对象,如果校验成功,则获取该对象信息。否则,去数据库中试一试。

  4. 如果都找不到,会尝试模拟一个用户(mockLoginUser方法),这个用处是方便调试的时候构造用户用的,生产上不要开启,会有危险。使用的方法一个是要在Spring Boot配置文件中配置:

    yaml 复制代码
    security:
      mock-enable: true
      mock-secret: test

    另一个需要在请求时的token以mock-secret配置的字符串作为开头,并组合用户id。比如"test1",即模拟id为1的用户,另外,要在请求头中传输tenant-id以表明现在的租户。

另一个过滤器cn.iocoder.yudao.framework.tenant.core.security.TenantSecurityWebFilter,负责从用户信息中解析出来租户id。如果无法解析出来租户id,或者租户id不一致,则报错。

官方文档信息

功能权限 | ruoyi-vue-pro 开发指南

数据权限 | ruoyi-vue-pro 开发指南

用户体系 | ruoyi-vue-pro 开发指南

功能权限说明安全相关的内容,如何开放功能。 数据权限说明,如果有些数据谁能看,谁查不出来的设计。 用户体系是关于用户设计方面的内容,用户分为管理员用户以及会员用户。管理员拥有更高的用户权限,能控制整个系统。会员用户仅能使用业务,无法控制系统的功能。

总结

以上便是ruoyi-vue-pro用户模块的相关设计。对于了解用户方面的相关信息有比较大的帮助。如果需要用到会员相关的功能,则需要按照官方文档介绍的内容开启会员中心模块。

相关推荐
小江的记录本1 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34161 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan1 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer2 小时前
Spring Framework 中文官方文档
java·后端·spring
Victor3562 小时前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor3563 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer3 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP4 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪
人间打气筒(Ada)4 小时前
如何基于 Go-kit 开发 Web 应用:从接口层到业务层再到数据层
开发语言·后端·golang
开心就好20254 小时前
使用Wireshark进行TCP数据包抓包分析:三次握手与四次挥手详解
后端·ios