简介
对于一个后端系统,最重要的就是用户。当拿到一个后端框架的时候,首先应该看看用户的设计,一个是作为开发来讲,平时接触最多的就是用户相关的业务,对用户再熟悉不过了;第二个是可以通过对用户的设计,管中窥豹,大致看看整个系统中,如何管理用户,比如用户的组织树对于权限或者业务有没有什么影响。
实体
后台管理用户
对应位置: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
方法中。
过滤器的逻辑:
-
通过请求地址的前缀,匹配是哪一类用户的访问(getLoginUserType方法),后台管理用户是
/admin-api
,会员用户是/app-api
。 -
根据用户类型和token,构建登录用户的信息(buildLoginUserByToken方法),缓存在后端系统中,供后续操作调用。
-
先从redis获取token对应的对象,如果校验成功,则获取该对象信息。否则,去数据库中试一试。
-
如果都找不到,会尝试模拟一个用户(mockLoginUser方法),这个用处是方便调试的时候构造用户用的,生产上不要开启,会有危险。使用的方法一个是要在Spring Boot配置文件中配置:
yamlsecurity: 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用户模块的相关设计。对于了解用户方面的相关信息有比较大的帮助。如果需要用到会员相关的功能,则需要按照官方文档介绍的内容开启会员中心模块。