Procházet zdrojové kódy

feat:系统管理临时保存

wangzaijun před 7 měsíci
rodič
revize
9fecddf169

+ 14 - 8
service-base/src/main/java/com/simuwang/base/components/ShiroLoginAuthAdapter.java

@@ -1,35 +1,41 @@
 package com.simuwang.base.components;
 
-import cn.hutool.core.collection.ListUtil;
+import com.simuwang.base.pojo.dos.SysMenuDO;
+import com.simuwang.base.pojo.dos.SysRoleDO;
 import com.simuwang.base.pojo.dos.SysUserDO;
 import com.simuwang.base.service.UserAuthService;
 import com.simuwang.shiro.core.ShiroUser;
 import com.simuwang.shiro.core.adapter.LoginAuthAdapter;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
- * 自定义的登录认证适配器实现,从数据库获取数据并且bean注入要调整为当前实现
+ * @author wangzaijun
+ * @date 2024/9/12 19:11
+ * @description 自定义的登录认证适配器实现,从数据库获取数据并且bean注入要调整为当前实现
  */
 public record ShiroLoginAuthAdapter(UserAuthService userAuthService) implements LoginAuthAdapter {
-
     @Override
     public ShiroUser findUserByUsername(String username) {
         SysUserDO userInfo = this.userAuthService.getUserInfoByUsername(username);
         ShiroUser sysUser = new ShiroUser();
-        sysUser.setUserId(userInfo.getUserId().toString());
+        sysUser.setUserId(userInfo.getUserId());
         sysUser.setUsername(userInfo.getUserName());
         sysUser.setPassword(userInfo.getPassword());
+        sysUser.setStatus(userInfo.getStatus());
         return sysUser;
     }
 
     @Override
-    public List<String> findRoleByUserId(String userId) {
-        return ListUtil.toList("SYSTEM");
+    public List<String> findRoleByUserId(Integer userId) {
+        List<SysRoleDO> roles = this.userAuthService.listUserRoleByUserId(userId);
+        return roles.stream().map(SysRoleDO::getRoleKey).distinct().collect(Collectors.toList());
     }
 
     @Override
-    public List<String> findPermissionsByUserId(String userId) {
-        return ListUtil.toList("RS:ALL", "RS:TEST");
+    public List<String> findPermissionsByUserId(Integer userId) {
+        List<SysMenuDO> menus = this.userAuthService.listUserMenuByUserId(userId);
+        return menus.stream().map(SysMenuDO::getPerms).distinct().collect(Collectors.toList());
     }
 }

+ 9 - 0
service-base/src/main/java/com/simuwang/base/mapper/SysMenuMapper.java

@@ -0,0 +1,9 @@
+package com.simuwang.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.simuwang.base.pojo.dos.SysMenuDO;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SysMenuMapper extends BaseMapper<SysMenuDO> {
+}

+ 9 - 0
service-base/src/main/java/com/simuwang/base/mapper/SysRoleMapper.java

@@ -0,0 +1,9 @@
+package com.simuwang.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.simuwang.base.pojo.dos.SysRoleDO;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SysRoleMapper extends BaseMapper<SysRoleDO> {
+}

+ 41 - 0
service-base/src/main/java/com/simuwang/base/mapper/SysUserMapper.java

@@ -1,9 +1,50 @@
 package com.simuwang.base.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.simuwang.base.pojo.dos.SysMenuDO;
+import com.simuwang.base.pojo.dos.SysRoleDO;
 import com.simuwang.base.pojo.dos.SysUserDO;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface SysUserMapper extends BaseMapper<SysUserDO> {
+    /**
+     * 获取用户管理员角色
+     *
+     * @param userId 用户id
+     * @return /
+     */
+    SysRoleDO getUserAdminRole(Integer userId);
+
+    /**
+     * 根据用户id从用户角色关系表查询该用户的所有角色信息
+     *
+     * @param userId 用户id
+     * @return /
+     */
+    List<SysRoleDO> selectRoleByUserId(Integer userId);
+
+    /**
+     * 获取所有角色信息
+     *
+     * @return /
+     */
+    List<SysRoleDO> selectAllRole();
+
+    /**
+     * 根据用户id从用户角色关系表和角色权限关系表查询该用户的所有权限信息
+     *
+     * @param userId 用户id
+     * @return /
+     */
+    List<SysMenuDO> selectMenuByUserId(Integer userId);
+
+    /**
+     * 获取全部权限信息
+     *
+     * @return /
+     */
+    List<SysMenuDO> selectAllMenu();
 }

+ 54 - 60
service-base/src/main/java/com/simuwang/base/pojo/dos/SysMenuDO.java

@@ -1,12 +1,10 @@
 package com.simuwang.base.pojo.dos;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
 
 /**
  * FileName: SysMenuDO
@@ -14,86 +12,82 @@ import java.util.Date;
  * Date:     2024/9/8 12:45
  * Description: ${DESCRIPTION}
  */
-@Data
+@Setter
+@Getter
 @TableName("sys_menu")
-public class SysMenuDO
-{
-    /** 菜单ID */
-    @TableId(value = "menu_id",type = IdType.AUTO)
-    private Long menuId;
+public class SysMenuDO extends BaseEntity {
+    /**
+     * 菜单ID
+     */
+    @TableId(value = "menu_id", type = IdType.AUTO)
+    private Integer menuId;
 
-    /** 菜单名称 */
-    @TableId(value = "menu_name")
+    /**
+     * 菜单名称
+     */
     private String menuName;
 
-    /** 父菜单ID */
-    @TableId(value = "parent_id")
-    private Long parentId;
+    /**
+     * 父菜单ID
+     */
+    private Integer parentId;
 
-    /** 显示顺序 */
-    @TableId(value = "order_num")
+    /**
+     * 显示顺序
+     */
     private Integer orderNum;
 
-    /** 路由地址 */
-    @TableId(value = "path")
+    /**
+     * 路由地址
+     */
     private String path;
 
-    /** 组件路径 */
-    @TableId(value = "component")
+    /**
+     * 组件路径
+     */
     private String component;
 
-    /** 路由参数 */
-    @TableId(value = "query")
+    /**
+     * 路由参数
+     */
     private String query;
 
-    /** 是否为外链(0是 1否) */
-    @TableId(value = "is_frame")
-    private String isFrame;
+    /**
+     * 是否为外链(0是 1否)
+     */
+    private Integer isFrame;
 
-    /** 是否缓存(0缓存 1不缓存) */
-    @TableId(value = "is_cache")
-    private String isCache;
+    /**
+     * 是否缓存(0缓存 1不缓存)
+     */
+    private Integer isCache;
 
-    /** 类型(M目录 C菜单 F按钮) */
-    @TableId(value = "menu_type")
+    /**
+     * 类型(M目录 C菜单 F按钮)
+     */
     private String menuType;
 
-    /** 显示状态(0显示 1隐藏) */
-    @TableId(value = "visible")
-    private String visible;
-    
-    /** 菜单状态(0正常 1停用) */
-    @TableId(value = "status")
-    private String status;
-
-    /** 权限字符串 */
-    @TableId(value = "perms")
-    private String perms;
+    /**
+     * 显示状态(0显示 1隐藏)
+     */
+    private Integer visible;
 
-    /** 菜单图标 */
-    @TableId(value = "icon")
-    private String icon;
-    /** 备注 */
-    @TableId(value = "remark")
-    private String remark;
     /**
-     * 创建者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+     * 菜单状态(0正常 1停用)
      */
-    @TableField(value = "creatorid")
-    private Integer creatorId;
+    private Integer status;
+
     /**
-     * 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+     * 权限字符串
      */
-    @TableField(value = "updaterid")
-    private Integer updaterId;
+    private String perms;
+
     /**
-     * 创建时间,默认第一次创建的getdate()时间
+     * 菜单图标
      */
-    @TableField(value = "createtime")
-    private Date createTime;
+    private String icon;
     /**
-     * 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+     * 备注
      */
-    @TableField(value = "updatetime")
-    private Date updateTime;
+    private String remark;
 }

+ 34 - 48
service-base/src/main/java/com/simuwang/base/pojo/dos/SysRoleDO.java

@@ -1,10 +1,10 @@
 package com.simuwang.base.pojo.dos;
 
-import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
 
 /**
  * FileName: SysRoleDO
@@ -12,61 +12,47 @@ import java.util.Date;
  * Date:     2024/9/8 12:45
  * Description: ${DESCRIPTION}
  */
-@Data
+@Setter
+@Getter
 @TableName("sys_role")
-public class SysRoleDO
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 角色ID */
-    private Long roleId;
-
-    /** 角色名称 */
-    private String roleName;
-
-    /** 角色权限 */
-    private String roleKey;
-
-    /** 角色排序 */
-    private String roleSort;
-
-    /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */
-    private String dataScope;
-
-    /** 角色状态(0正常 1停用) */
-    private String status;
-
-    /** 删除标志(0代表存在 1代表删除) */
-    private String delFlag;
+public class SysRoleDO extends BaseEntity {
+    /**
+     * 角色ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer roleId;
 
-    /** 用户是否存在此角色标识 默认不存在 */
-    private boolean flag = false;
-    /** 备注 */
-    @TableId(value = "remark")
-    private String remark;
     /**
-     * 记录的有效性;1-有效;0-无效;
+     * 角色名称
      */
-    @TableField(value = "isvalid")
-    private Integer isvalid;
+    private String roleName;
+
     /**
-     * 创建者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+     * 角色权限
      */
-    @TableField(value = "creatorid")
-    private Integer creatorId;
+    private String roleKey;
+
     /**
-     * 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+     * 角色排序
      */
-    @TableField(value = "updaterid")
-    private Integer updaterId;
+    private Integer roleSort;
+
+//    /**
+//     * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)
+//     */
+//    private String dataScope;
+
     /**
-     * 创建时间,默认第一次创建的getdate()时间
+     * 角色状态(0正常 1停用)
      */
-    @TableField(value = "createtime")
-    private Date createTime;
+    private Integer status;
+
+//    /**
+//     * 用户是否存在此角色标识 默认不存在
+//     */
+//    private boolean flag = false;
     /**
-     * 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+     * 备注
      */
-    @TableField(value = "updatetime")
-    private Date updateTime;
+    private String remark;
 }

+ 0 - 24
service-base/src/main/java/com/simuwang/base/pojo/dos/SysRoleMenuDO.java

@@ -1,24 +0,0 @@
-package com.simuwang.base.pojo.dos;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-/**
- * FileName: SysRoleMenuDO
- * Author:   chenjianhua
- * Date:     2024/9/8 12:45
- * Description: ${DESCRIPTION}
- */
-@Data
-@TableName("sys_role_menu")
-public class SysRoleMenuDO
-{
-    /** 角色ID */
-    @TableId(value = "role_id")
-    private Long roleId;
-    
-    /** 菜单ID */
-    @TableId(value = "menu_id")
-    private Long menuId;
-}

+ 4 - 4
service-base/src/main/java/com/simuwang/base/pojo/dos/SysUserDO.java

@@ -20,7 +20,7 @@ public class SysUserDO extends BaseEntity {
      * 用户ID
      */
     @TableId(value = "user_id", type = IdType.AUTO)
-    private Long userId;
+    private Integer userId;
 
     /**
      * 用户名称
@@ -30,7 +30,7 @@ public class SysUserDO extends BaseEntity {
     /**
      * 用户类型
      */
-    private String userType;
+    private Integer userType;
 
     /**
      * 用户邮箱
@@ -45,7 +45,7 @@ public class SysUserDO extends BaseEntity {
     /**
      * 用户性别
      */
-    private String sex;
+    private Integer sex;
 
     /**
      * 用户头像
@@ -59,7 +59,7 @@ public class SysUserDO extends BaseEntity {
     /**
      * 帐号状态(0正常 1停用)
      */
-    private String status;
+    private Integer status;
 
 //    /**
 //     * 删除标志(0代表存在 1代表删除)

+ 0 - 25
service-base/src/main/java/com/simuwang/base/pojo/dos/SysUserRole.java

@@ -1,25 +0,0 @@
-package com.simuwang.base.pojo.dos;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-/**
- * FileName: SysUserRole
- * Author:   chenjianhua
- * Date:     2024/9/8 12:45
- * Description: ${DESCRIPTION}
- */
-@Data
-@TableName("sys_user_role")
-public class SysUserRole
-{
-    /** 用户ID */
-    @TableField(value = "user_id")
-    private Long userId;
-    
-    /** 角色ID */
-    @TableField(value = "role_id")
-    private Long roleId;
-
-}

+ 42 - 1
service-base/src/main/java/com/simuwang/base/service/UserAuthService.java

@@ -3,9 +3,14 @@ package com.simuwang.base.service;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.simuwang.base.mapper.SysUserMapper;
+import com.simuwang.base.pojo.dos.SysMenuDO;
+import com.simuwang.base.pojo.dos.SysRoleDO;
 import com.simuwang.base.pojo.dos.SysUserDO;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Objects;
+
 @Service
 public class UserAuthService {
     private final SysUserMapper userMapper;
@@ -22,7 +27,43 @@ public class UserAuthService {
      */
     public SysUserDO getUserInfoByUsername(String username) {
         LambdaQueryWrapper<SysUserDO> wrapper = Wrappers.lambdaQuery(SysUserDO.class)
-                .eq(SysUserDO::getUserName, username).eq(SysUserDO::getValid, 1);
+                .eq(SysUserDO::getUserName, username);
         return this.userMapper.selectOne(wrapper);
     }
+
+    /**
+     * 根据用户id获取角色权限列表
+     *
+     * @param userId 用户id
+     * @return /
+     */
+    public List<SysRoleDO> listUserRoleByUserId(Integer userId) {
+        boolean admin = this.isAdmin(userId);
+        if (admin) {
+            return this.userMapper.selectAllRole();
+        }
+        return this.userMapper.selectRoleByUserId(userId);
+    }
+
+    /**
+     * 根据用户id获取菜单列表
+     *
+     * @param userId 用户id
+     * @return /
+     */
+    public List<SysMenuDO> listUserMenuByUserId(Integer userId) {
+        boolean admin = this.isAdmin(userId);
+        if (admin) {
+            return this.userMapper.selectAllMenu();
+        }
+        return this.userMapper.selectMenuByUserId(userId);
+    }
+
+    private boolean isAdmin(Integer userId) {
+        if (Objects.equals(0, userId) || Objects.equals(1, userId)) {
+            return true;
+        }
+        SysRoleDO userAdminRole = this.userMapper.getUserAdminRole(userId);
+        return false;
+    }
 }

+ 9 - 7
service-base/src/main/java/com/simuwang/shiro/core/ShiroUser.java

@@ -14,17 +14,19 @@ import java.util.List;
 @Setter
 @Getter
 public class ShiroUser {
-    private String userId;
+    private Integer userId;
 
     private String username;
 
-    private String realName;
-
-    @JsonIgnore
-    private String salt;
-
     @JsonIgnore
     private String password;
-
+    /**
+     * 用户状态,0-正常,1-停用
+     */
+    private Integer status;
+    /**
+     * 用户权限信息
+     */
+    @JsonIgnore
     private List<String> permissionCodes;
 }

+ 2 - 2
service-base/src/main/java/com/simuwang/shiro/core/adapter/LoginAuthAdapter.java

@@ -12,7 +12,7 @@ import java.util.List;
 public interface LoginAuthAdapter {
     ShiroUser findUserByUsername(String username);
 
-    List<String> findRoleByUserId(String userId);
+    List<String> findRoleByUserId(Integer userId);
 
-    List<String> findPermissionsByUserId(String userId);
+    List<String> findPermissionsByUserId(Integer userId);
 }

+ 4 - 4
service-base/src/main/java/com/simuwang/shiro/core/adapter/SimpleLoginAuthAdapter.java

@@ -15,20 +15,20 @@ public class SimpleLoginAuthAdapter implements LoginAuthAdapter {
     @Override
     public ShiroUser findUserByUsername(String username) {
         ShiroUser sysUser = new ShiroUser();
-        sysUser.setUserId("1");
+        sysUser.setUserId(0);
         sysUser.setUsername("admin");
         sysUser.setPassword(new SimpleHash("SHA-256", "123456", "1234567890abcdef", 1000).toHex());
-        sysUser.setSalt("1234567890abcdef");
+        sysUser.setStatus(0);
         return sysUser;
     }
 
     @Override
-    public List<String> findRoleByUserId(String userId) {
+    public List<String> findRoleByUserId(Integer userId) {
         return ListUtil.toList("ADMIN");
     }
 
     @Override
-    public List<String> findPermissionsByUserId(String userId) {
+    public List<String> findPermissionsByUserId(Integer userId) {
         return ListUtil.toList("RS:ALL");
     }
 }

+ 2 - 2
service-base/src/main/java/com/simuwang/shiro/core/bridge/AuthBridgeService.java

@@ -37,11 +37,11 @@ public class AuthBridgeService {
         return simpleAuthorizationInfo;
     }
 
-    public List<String> findRoles(String userId) {
+    public List<String> findRoles(Integer userId) {
         return this.loginAuthAdapter.findRoleByUserId(userId);
     }
 
-    public List<String> findPermissions(String userId) {
+    public List<String> findPermissions(Integer userId) {
         return this.loginAuthAdapter.findPermissionsByUserId(userId);
     }
 }

+ 5 - 1
service-base/src/main/java/com/simuwang/shiro/core/impl/ShiroDbRealmImpl.java

@@ -6,10 +6,11 @@ import com.simuwang.shiro.core.bridge.AuthBridgeService;
 import org.apache.shiro.authc.*;
 import org.apache.shiro.authc.credential.CredentialsMatcher;
 import org.apache.shiro.authz.AuthorizationInfo;
-import org.apache.shiro.lang.util.ByteSource;
 import org.apache.shiro.subject.PrincipalCollection;
 import org.springframework.stereotype.Component;
 
+import java.util.Objects;
+
 @Component
 public class ShiroDbRealmImpl extends ShiroDbRealm {
     private final AuthBridgeService authBridgeService;
@@ -34,6 +35,9 @@ public class ShiroDbRealmImpl extends ShiroDbRealm {
         if (shiroUser == null) {
             throw new UnknownAccountException("账号不存在");
         }
+        if (Objects.equals(1, shiroUser.getStatus())) {
+            throw new UnknownAccountException("账号已停用");
+        }
         shiroUser.setPermissionCodes(this.authBridgeService.findPermissions(shiroUser.getUserId()));
         return new SimpleAuthenticationInfo(shiroUser, shiroUser.getPassword(), getName());
     }

+ 23 - 0
service-base/src/main/resources/mapper/SysUserMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.simuwang.base.mapper.SysUserMapper">
+    <select id=""></select>
+
+    <select id="selectRoleByUserId" resultType="com.simuwang.base.pojo.dos.SysRoleDO">
+        select t.role_id as roleId,
+               t.role_name as roleName,
+               t.role_key as roleKey,
+               t.role_sort as roleSort,
+               t.status as status,
+               t.data_scope as dataScope,
+               t.remark,
+               t.creatorid as creatorId,
+               t.createtime as createTime,
+               t.updaterid as updaterId,
+               t.updatetime as updateTime
+        from sys_role t
+        join sys_user_role t1 on t.role_id = t1.role_id
+        join sys_user t2 on t1.user_id = t2.user_id and t2.isvalid = 1
+        where t2.user_id = #{userId} and t.isvalid = 1
+    </select>
+</mapper>