从零搭建若依(Ruoyi-Vue)管理系统(13)--登录和鉴权的实现

文章目录

    • 1. 新建相关数据表
    • 3. 登录和鉴权处理逻辑
      • 3.1 状态码
      • 3.2 新增登录用户信息类
      • 3.3 UserDetailsServiceImpl
      • 3.3 token认证过滤器 JwtAuthenticationTokenFilter
      • 3.4 跨域过滤器配置
      • 3.5 退出处理类
      • 3.6. 注入Spring Security配置文件
      • 3.7 用户权限处理service SysPermissionService
    • 4. 登录接口实现
      • 4.1 新增用户接口
      • 4.2 生成验证码接口
      • 4.3 登录接口

本章结束后对应的节选代码文件:Gangbb-Vue-12-13-Login(与12章合并)
https://github.com/Gang-bb/Gangbb-Vue
历史遗留TODO:

  • 第四章
  1. 登录日志还未实现。(到登录和权限模块完成)
  2. LogAspect从缓存获取当前的用户信息使用模拟的数据(到登录和权限模块完成)
  • 第十一章
  1. 需要在Spring Security中注册的登录鉴权逻辑处理类、JWT处理的过滤器、退出登录处理类(到登录和权限模块完成)

本章将留下TODO:

本章将解决TODO:

  • 第四章
  1. 登录日志还未实现。(到登录和权限模块完成)
  2. LogAspect从缓存获取当前的用户信息使用模拟的数据(到登录和权限模块完成)
  • 第十一章
  1. 需要在Spring Security中注册的登录鉴权逻辑处理类、JWT处理的过滤器、退出登录处理类(到登录和权限模块完成)

1. 新建相关数据表

SysDeptSysMenuSysPostSysRoleSysRoleDeptSysRoleMenuSysUserPostSysUserRolesys_login_info

所有表都加上BaseEntity的数据

把若依原有表中代表值字段全部换成int类型。

然后加入对应的entity、dao、service、.xml文件

3. 登录和鉴权处理逻辑

3.1 状态码

与若依不同的是,我们这章还是使用之前搭建的错误返回。

新增的状态码:

从零搭建若依(Ruoyi-Vue)管理系统(13)--登录和鉴权的实现_第1张图片

3.2 新增登录用户信息类

SysUserDTO该类是登录时,用户所携带的各种信息。并且实现UserDetails接口。作用详细介绍请看第十章中的2.1(主要的作用就是可以作为Spring Security的用户信息处理类)。在package com.gangbb.core.model.dto;目录下。若依中叫(LoginUser)。

3.3 UserDetailsServiceImpl

UserDetailsServiceImpl该类实现了登录的验证和鉴权的逻辑,并且实现了UserDetailsService(在第十章的2.1中介绍到)接口,因此可注册为Spring Security处理用户登录的逻辑。在用户账号的是否删除和账号状态的判断上有所不同。

主要逻辑:

  1. 判断传入用户名是否为空
  2. 判断用户名是否存在
  3. 判断账号是否被停用
  4. 所有校验通过后,返回SysUserDTO用户信息类,并加上权限相关信息。

辅助的类:

  • UserStatus枚举

  • UserConstants中添加了用户删除的状态:

    /** 用户删除 */
    public static final int USER_DELETE = 1;
    

3.3 token认证过滤器 JwtAuthenticationTokenFilter

添加依赖

Gangbb-Vue--pom.xml

<properties>
    <bitwalker.version>1.21bitwalker.version>
    <jwt.version>0.9.1jwt.version>
properties>


<dependency>
    <groupId>io.jsonwebtokengroupId>
    <artifactId>jjwtartifactId>
    <version>${jwt.version}version>
dependency>



<dependency>
    <groupId>eu.bitwalkergroupId>
    <artifactId>UserAgentUtilsartifactId>
    <version>${bitwalker.version}version>
dependency>

Gangbb-common--pom.xml


<dependency>
    <groupId>io.jsonwebtokengroupId>
    <artifactId>jjwtartifactId>
dependency>



<dependency>
    <groupId>eu.bitwalkergroupId>
    <artifactId>UserAgentUtilsartifactId>
dependency>

添加一些工具类

id生成工具IdUtils

提供通用唯一识别码工具UUID

安全服务工具类ServletUtils

类token验证处理TokenService

TokenService 中使用了配置文件中声明的属性需要到Gangbb-admin下的application.yml中配置token的相关属性:

# token配置
token:
  # 令牌自定义标识
  header: AUTH-TOKEN
  # 令牌密钥
  secret: abcdefghijklmnopqrstuvwxyz
  # 令牌有效期(默认30分钟)
  expireTime: 30

PS:

  • 上述类中,redis调用的一些方法不一样(因为没有使用若依封装的redis工具类)。

JwtAuthenticationTokenFilter主要作用

  • 操作相差不足20分钟,自动刷新验证令牌有效期,
  • 令牌验证
  • 通过验证,在Spring Security上下文中写入用户登录相关所有信息

3.4 跨域过滤器配置

我们之前在国际化那一个章节中提到WebMvcConfig这个类,它的作用是自定义实现 WebMvcConfigurer接口类来扩展springmvc的功能。

我们效仿若依,把CorsFilter的配置和Bean的初始化放到这个类中。(若依中该类叫ResourcesConfig)

package com.gangbb.core.config.WebMvcConfig文件中加入以下配置:

/**
 * 跨域过滤器配置
 */
@Bean
public CorsFilter corsFilter()
{
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    // 设置访问源地址
    config.addAllowedOrigin("*");
    // 设置访问源请求头
    config.addAllowedHeader("*");
    // 设置访问源请求方法
    config.addAllowedMethod("*");
    // 对接口配置跨域设置
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

3.5 退出处理类

LogoutSuccessHandlerImpl

主要功能:

  • 删除用户缓存记录
  • 记录用户退出日志

辅助工具

修改AsyncFactory:该工具是第四章整合日志时添加的,当时还没有recordLogininfor增加记录登录信息 方法

新增LogUtils:处理并记录日志文件

新建SysLoginInfoService和其实现类SysLoginInfoServiceImpl和数据操作层SysLoginInfoMapperSysLoginInfoMapper.xml

3.6. 注入Spring Security配置文件

SecurityConfig中配置注入:

  • LogoutSuccessHandlerImpl
  • 自定义实现的UserDetailsService
  • JwtAuthenticationTokenFilter
  • CorsFilter

3.7 用户权限处理service SysPermissionService

(二)用户权限处理相关service

SysUser中添加判断用户是否为管理员的方法

public boolean isAdmin()
{
    return isAdmin(this.id);
}

public static boolean isAdmin(Long userId)
{
    return userId != null && 1L == userId;
}
  • 需要添加根据用户ID查询权限根据用户ID查询菜单权限相关的各层文件方法。

4. 登录接口实现

4.1 新增用户接口

新增SysUserController,还有SysUser各层文件的逻辑实现,功能实现与若依相同,实现方式有些区别。比如若依喜欢把逻辑写在Controller中,我比较喜欢把逻辑写在Service中。

增加新增用户接口/test/system/user/addUser(暂时用test前缀,跳过secutity的url拦截)

新增一个用户

image-20210716140114014

4.2 生成验证码接口

package com.gangbb.web.controller.system.CaptchaController

辅助操作

  • Gangbb-coreGangbb-Vue分别加入验证码相应依赖
  • 验证码配置类CaptchaConfig
  • 验证码文本生成器KaptchaTextCreator(记得到CaptchaConfig修改生成器的路径)
  • Base64工具类Base64
  • application.yml文件中加上验证码类型(gangbb.captchaType)

4.3 登录接口

  • 参照若依的登录接口定义在package com.gangbb.web.controller.monitorSysLoginController

  • 新增 登录校验方法SysLoginServiceImpl:与若依实现中有不同。(Redis工具调用、错误返回等)

  • 登录需要修改之前的SysUserService.selectUserByUserName,之前章节没有实现。

  • 修改SysMenuService,新增与若依相同的方法。

登录测试时,发现会报序列化错误。因为sysUser中有

从零搭建若依(Ruoyi-Vue)管理系统(13)--登录和鉴权的实现_第2张图片

方法有返回值,所以在序列化时,返回的值也会被序列化存在缓存中,此时不会出错,但是从缓存中反序列化时就因为有些值没有set方法,所以会出错。

RedisConfig的序列化配置中加上:

om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false); ```


最后记得修改`LogAspect`中:

```java
// 从缓存获取当前的用户
SysUserDTO sysUserDTO = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
.....
// 访问的用户名
sysOperationLog.setOperationName(sysUserDTO.getUsername());

你可能感兴趣的:(#,从零搭建若依管理系统,java实战开发,vue.js,java,spring)