返回顶部
首页 > 资讯 > 数据库 >MySQL数据权限的实现详情
  • 561
分享到

MySQL数据权限的实现详情

MySQL数据权限实现MySQL数据权限 2022-08-12 09:08:08 561人浏览 薄情痞子
摘要

目录数据权限模型实现效果数据模型数据权限表结构授权维度表具体授权维度表(产品线)组件路由表角色表角色组件绑定表角色组件授权规则表(核心)实现过程代码实现自定义数据权限注解定义数据权限处理切面数据权限工具类查询组件规则Co

数据权限模型

上篇文章的数据模型是基于传统的RBAC模型来设计的,由于我们这里的应用场景不一样,所以这里的数据权限模型并没有严格按照上篇文章的方案来设计,但是万变不离其宗,核心原理还是相同的。

首先我来介绍一下我们最终实现的效果

实现效果

MySQL数据权限的实现详情

一个组件(可以理解成菜单)可以绑定多个授权维度,当给角色授权组件时可以给这个授权组件赋予不同维度的权限。

关于数据权限的授权维度有以下几个关键点需要仔细体会:

  • 给一个角色勾选授权维度实际上是在限制这个角色所能看到的数据范围
  • 任何一个授权维度勾选了"全部",相当于不限制此维度的权限。
    • 如果一个角色勾选了客户群的全部 + A产品线,那么最终生成的sql 会是 where 产品线 in ('A产品线')
  • 如果一个角色勾选了多个维度,维度之间用 AND 拼接
    • ​ 如果一个角色勾选了A客户群 + B产品线,那么最终生成的sql 会是 where 客户群 in('A客户群')AND 产品线 in ('B产品线')
  • 一个用户可能有多个角色,角色之间用 OR 拼接
    • ​ 一个用户有两个角色:客户群总监,产品线经理。其中客户群总监角色拥有A客户群和B客户群的权限,产品线经理角色拥有A产品线权限,那么最终生成的sql会是 where 客户群 in ('A客户群','B客户群') OR 产品线 in ('A产品线')

当然我们业务场景中数据规则比较单一,全部使用 in作为sql条件连接符,你们可以根据实际业务场景进行补充。

数据模型

最终的数据模型如下所示:

MySQL数据权限的实现详情

这里的组件大家完全可以理解成RBAC模型中的资源、菜单,只不过叫法不同而已。

数据权限表结构

下面是具体的表结构设计

授权维度表

CREATE TABLE `wb_dimension` (
  `ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
  `DIMENSION_CODE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '维度编码',
  `DIMENSION_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '维度名称',
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='授权维度'

具体授权维度表(产品线)

CREATE TABLE `wb_dimension_proc_line` (
  `ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
  `DIMENSION_CODE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '维度编码',
  `PROC_LINE_CODE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '产品线编码',
  `PROC_LINE_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '产品线名称',
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='授权维度-产品线'

跟授权维度表实际是一个表继承的关系,由于每个授权维度的属性不一样,展现形式也不一样,所以分表存储。

组件路由表

CREATE TABLE `wb_route` (
  `ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键ID',
  `COMPONENT_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件ID',
  `ROUTE_URL` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由地址',
  `AUTHORIZATION_TYPE` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '授权方式:1 自定义,2 上下级授权, 3 范围授权',
  `AUTHORIZATION_DIMENSION` JSON DEFAULT NULL COMMENT '授权维度',
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='组件路由'
复制代码

当组件属性授权方式为范围授权时在应用侧会强制要求选择具体的授权维度,如 产品线、客户群。

角色表

CREATE TABLE `wb_role` (
  `ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键ID',
  `ROLE_CODE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色CODE',
  `ROLE_NAME` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色名称',
  `IDENTITY_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '身份ID'
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色表'

角色上有一个身份属性,多个角色可以归属同一个身份,方便对角色进行分类管理。

角色组件绑定表

CREATE TABLE `role_component_relation` (
  `ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键ID',
  `ROLE_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色ID',
  `COMPONENT_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '组件ID',
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色授权组件'

角色组件授权规则表(核心)

CREATE TABLE `wb_role_component_rule` (
  `ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
  `ROLE_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色ID',
  `COMPONENT_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件ID',
  `RULE_CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '规则编码',
  `RULE_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '规则名称',
  `RULE_CONDITION` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '规则条件',
  `RULE_VALUE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '规则值',
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色组件维度规则表'

数据权限的核心表,规则条件的取值为IN,规则值存储具体的维度编码,当在数据维度中选择 全部 时我们将规则值存储为ALL这个特殊值,方便后续生成SQL语句。

MySQL数据权限的实现详情

实现过程

  • 自定义一个数据权限的注解,比如叫DataPermission
  • 在对应的资源请求方法,比如商机列表上添加自定义注解@DataPermission
  • 利用aop抓取到用户对应角色的所有数据规则并进行SQL拼接,最终在SQL层面实现数据过滤。

代码实现

自定义数据权限注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
@Documented
public @interface DataPermission {
	
	String permissionType() default "2";
	
	
	String componentRoute() default "";
}

定义数据权限处理切面

@ASPect
@Slf4j
public class DataPermissionAspect {

	@Autowired
	private RoleComponentRuleService roleComponentRuleService;

	@Pointcut("@annotation(com.ifly.workbench.security.annotation.DataPermission)")
	public void pointCut() {
		
	}
	
	@Around("pointCut()")
	public Object around(ProceedingJoinPoint point) throws  Throwable{

		httpservletRequest request = springContextUtils.getHttpServletRequest();

		//获取请求token
		String token = request.getHeader(CommonConstant.X_Access_TOKEN);
		String userName = JwtUtil.getUsername(token);
    
		MethodSignature signature = (MethodSignature) point.getSignature();
		Method method = signature.getMethod();
		DataPermission permissionData = method.getAnnotation(DataPermission.class);

    //获取授权方式
		String permissionType = permissionData.permissionType();
		//获取组件路由
		String componentRoute = permissionData.componentRoute();
    
    if (StringUtils.isNotEmpty(componentRoute)){
			// 查找当前用户此组件下的所有规则
			List<RoleComponentRuleDTO> componentRules = roleComponentRuleService.getRoleComponentRule(userName, componentRoute);
      
			if(CollectionUtils.isNotEmpty(componentRules)){
					DataPermissionUtils.installDataSearchConditon(request, componentRules);
					SysUserCacheInfo userInfo = buildCacheUser(userName);
					DataPermissionUtils.installUserInfo(request, userInfo);
				}
		}
    
    return  point.proceed();
	}

	private SysUserCacheInfo buildCacheUser(String userName) {
		SysUserCacheInfo info = new SysUserCacheInfo();
		info.setSysUserName(userName);
		info.setOneDepart(true);
		return info;
	}
}

在AOP中获取当前用户、需要访问的组件中所有的数据规则,参考wb_role_component_rule表设计,并将其放到Request作用域中。

数据权限工具类

public class DataPermissionUtils {
	public static final String COMPONENT_DATA_RULES = "COMPONENT_DATA_RULES";

	public static final String SYS_USER_INFO = "SYS_USER_INFO";
   
	public static void installDataSearchConditon(HttpServletRequest request, List<RoleComponentRuleDTO> componentRules) {
		// 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST
		List<RoleComponentRuleDTO> list = loadDataSearchCondition();

		if (list==null) {
			// 2.如果不存在,则new一个list
			list = Lists.newArrayList();
		}
		list.addAll(componentRules);
		// 3.往list里面增量存指
		request.setAttribute(COMPONENT_DATA_RULES, list);
	}

	
	@SuppressWarnings("unchecked")
	public synchronized List<RoleComponentRuleDTO> loadDataSearchCondition() {
		return (List<RoleComponentRuleDTO>) SprinGContextUtils.getHttpServletRequest().getAttribute(COMPONENT_DATA_RULES);
				
	}
	
	public synchronized void installUserInfo(HttpServletRequest request, SysUserCacheInfo userinfo) {
		request.setAttribute(SYS_USER_INFO, userinfo);
	}
}

在Request中存储数据规则。

查询组件规则

public interface RoleComponentRuleService extends IService<RoleComponentRule> {

    
    List<RoleComponentRuleDTO> getRoleComponentRule(String userName, String componentCode);
}
@Service
public class RoleComponentRuleServiceImpl extends ServiceImpl<RoleComponentRuleMapper, RoleComponentRule> implements RoleComponentRuleService {

    @Resource
    private RoleComponentRuleMapper roleComponentRuleMapper;

    
    @Override
    public List<RoleComponentRuleDTO> getRoleComponentRule(String userName, String componentCode) {
        return roleComponentRuleMapper.getRoleComponentRule(userName,componentCode);
    }

}
<select id="getRoleComponentRule" resultType="com.ifly.vo.RoleComponentRuleDTO">
	SELECT
    tab1.id,
    tab1.role_id,
    tab4.role_code,
    tab1.component_id,
    tab1.rule_code,
    tab1.rule_name,
    tab1.rule_condition,
    tab1.rule_value,
    tab4.identity_id
  FROM
  	wb_role_component_rule tab1
  	LEFT JOIN user_role_relation tab2 ON tab2.role_id = tab1.role_id
  	LEFT JOIN wb_component tab3 ON tab3.id = tab1.component_id
  	LEFT JOIN wb_role tab4 ON tab4.id = tab1.role_id
  	JOIN role_component_relation tab5 ON tab5.role_id = tab1.role_id
  	AND tab5.component_id = tab1.component_id
  where
  	tab2.user_account = #{userName}
  	and tab3.component_code = #{componentCode}
</select>

Controller调用

@apiOperation(value = "服务BU-领导-总览")
@GetMapping("opp/getLeaderOverviewSve")
@DataPermission(componentRoute = "020202")
public Result<SalesProjOverviewSve> getLeaderOverviewSve(@RequestParam(name = "identityId") String identityId) {
	String permissionSql = RuleQueryGenerator.getPermissionSql(identityId);
  log.info("查服务BU-领导-总览-permissionSQL==" + permissionSql);

	return Result.OK(overviewSveService.getLeaderOverviewSve(permissionSql));
}

在controller的请求方法上加上自定义注解@DataPermission并指定组件编码,然后通过工具类生成SQL条件,最后将SQL条件传入service层进行处理。

构建数据权限SQL

@Slf4j
@UtilityClass
public class RuleQueryGenerator {

    private static final String SQL_AND = " and ";

    private static final String SQL_OR = " or ";

    private static final String SQL_JOINT = " (%s) ";

    
    public String getPermissionSql(String identityId) {
        //------------------------获取当前身份的数据规则------------------------------------
        List<RoleComponentRuleDTO> conditionList = getCurrentIdentyPermission(identityId);
        if (CollectionUtils.isEmpty(conditionList)) {
            //没有权限
            return "1 = 0";
        }
        //存在权限
        //对当前身份根据规则编码分组-去除不同角色中相同编码且规则值为ALL的规则 并根据角色id分组
        Map<String, List<RoleComponentRuleDTO>> ruleMap = getRuleMapByRoleId(conditionList);

        StringBuilder sb = new StringBuilder();
        String roleSql;
        if (MapUtils.isNotEmpty(ruleMap)) {
            //按角色拼接SQL
            for (Map.Entry<String, List<RoleComponentRuleDTO>> entry : ruleMap.entrySet()) {

                List<RoleComponentRuleDTO> lists = entry.getValue();

                // 同角色之间使用 AND
                roleSql = buildRoleSql(lists);

                //角色之间使用 OR
                if (StringUtils.isNotEmpty(roleSql)) {
                    jointSqlByRoles(sb, roleSql);
                }
            }

        }
        return sb.toString();
    }

    private static List<RoleComponentRuleDTO> getCurrentIdentyPermission(String identityId) {
        //----------------------------获取所有数据规则-----------------------------
        List<RoleComponentRuleDTO> roleRuleList = DataPermissionUtils.loadDataSearchCondition();
        if(CollectionUtils.isEmpty(roleRuleList)){
            return null;
        }
        //-----------------------------过滤掉不属于当前身份的规则-----------------------------------
        return roleRuleList.stream()
                .filter(item -> item.getIdentityId().equals(identityId))
                .collect(Collectors.toList());
    }

    
    private static String buildRoleSql(List<RoleComponentRuleDTO> lists) {
        StringBuilder roleSql = new StringBuilder();
        for (RoleComponentRuleDTO item : lists) {
            //如果出现全选 则 代表全部,不需要限定范围
            if ("ALL".equals(item.getRuleValue())) {
                continue;
            }
            //将规则转换成SQL
            String filedSql = convertRuleToSql(item);

            roleSql.append(SQL_AND).append(filedSql);
        }
        return roleSql.toString();
    }


    
    private static String convertRuleToSql(RoleComponentRuleDTO rule) {
        String whereCondition = " in ";
        String ruleValueConvert = getInConditionValue(rule.getRuleValue());
        return rule.getRuleCode() + whereCondition + ruleValueConvert;
    }


    
    private static String getInConditionValue(String ruleValue) {
        String[] temp = ruleValue.split(",");
        StringBuilder res = new StringBuilder();
        for (String string : temp) {
            res.append(",'").append(string).append("'");
        }
        return "(" + res.substring(1) + ")";
    }

    
    private static void jointSqlByRoles(StringBuilder sqlBuilder, String roleSql) {
        roleSql = roleSql.replaceFirst(SQL_AND, "");
        if (StringUtils.isEmpty(sqlBuilder.toString())) {
            sqlBuilder.append(String.format(SQL_JOINT, roleSql));
        } else {
            sqlBuilder.append(SQL_OR).append(String.format(SQL_JOINT, roleSql));
        }
    }

    
    private static Map<String, List<RoleComponentRuleDTO>> getRuleMapByRoleId(List<RoleComponentRuleDTO> conditionList) {
    //--------过滤掉不属于当前身份的规则,并对条件编码进行分组-----------------------------------
    Map<String, List<RoleComponentRuleDTO>> conditionMap = conditionList.stream().collect(Collectors.groupingBy(RoleComponentRuleDTO::getRuleCode));

		//--------相同编码分组中存在ALL的排除掉-----------------------------------------------
    List<RoleComponentRuleDTO> newRoleRuleList = new ArrayList<>();
    if (MapUtils.isNotEmpty(conditionMap)) {
    	for (Map.Entry<String, List<RoleComponentRuleDTO>> entry : conditionMap.entrySet()) {
      	boolean flag = true;
        List<RoleComponentRuleDTO> lists = entry.getValue();
        for (RoleComponentRuleDTO item : lists) {
        	if ("ALL".equals(item.getRuleValue())) {
          	flag = false;
            break;
          }
        }
        
        if (flag) {
           newRoleRuleList.addAll(lists);
        }
     	}
     }
     if (CollectionUtils.isNotEmpty(newRoleRuleList)) {
        return newRoleRuleList.stream().collect(Collectors.groupingBy(RoleComponentRuleDTO::getRoleId));
      }
     return Maps.newHashMap();
    }
}

核心类,用于生成数据权限查询的SQL脚本。

Dao层实现

<select id="getLeaderOverviewSve" resultType="com.ifly.center.entity.SalesProjOverviewSve">
	SELECT <include refid="column_list"/>  FROM U_STD_ADS.LTC_SALES_PROJ_OVERVIEW_SVE
  <where>
  	<if test="permissionSql != null and permissionSql != ''">
  		${permissionSql}
    </if>
 	</where>
</select>

Dao层接受service层传入已经生成好的sql语句,作为查询条件直接拼接在业务语句之后。

小结

以上,就是数据权限的实现过程,其实代码实现并不复杂,主要还是得理解其中的实现原理。如果你也有数据权限的需求,不妨参考一下。

到此这篇关于Mysql数据权限的实现详情的文章就介绍到这了,更多相关SQL数据权限内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL数据权限的实现详情

本文链接: https://lsjlt.com/news/33666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL数据权限的实现详情
    目录数据权限模型实现效果数据模型数据权限表结构授权维度表具体授权维度表(产品线)组件路由表角色表角色组件绑定表角色组件授权规则表(核心)实现过程代码实现自定义数据权限注解定义数据权限处理切面数据权限工具类查询组件规则Co...
    99+
    2022-08-12
    MySQL数据权限实现 MySQL数据权限
  • MySQL数据库——MySQL user权限表详解
    MySQL 在安装时会自动创建一个名为 mysql 的数据库,mysql 数据库中存储的都是用户权限表。用户登录以后,MySQL 会根据这些权限表的内容为每个用户赋予相应的权限。 user 表是 MySQL 中最重要的一个权限表,用来记录允...
    99+
    2023-09-10
    数据库 mysql 服务器
  • 数据设计之权限的实现
    目录前言RBAC模型数据权限数据规则关联资源、用户继续优化小结前言 在项目实际开发中我们不光要控制一个用户能访问哪些资源,还需要控制用户只能访问资源中的某部分数据。 控制一个用户能访...
    99+
    2022-11-13
    数据设计权限实现 数据权限
  • Mybatis-plus数据权限DataPermissionInterceptor实现
    目录前言一、源码分析二、使用案例尝试验证@InterceptorIgnore注解实践应用总结前言 数据权限因分页问题,不可能通过代码对数据进行过滤处理,只能在数据库语句进行处理,而如...
    99+
    2024-04-02
  • 如何查看PG数据库的权限情况
    这篇文章主要为大家展示了“如何查看PG数据库的权限情况”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何查看PG数据库的权限情况”这篇文章吧。 ...
    99+
    2024-04-02
  • MySQL用户和数据权限管理详解
    目录1、管理用户1.1、添加用户1.2、删除用户1.3、修改用户名1.4、修改密码2、授予权限和回收权限2.1、授予权限2.2、权限的转移和限制2.3、回收权限1、管理用户 1.1、添加用户 可以使用CREATE USE...
    99+
    2024-04-02
  • MySQL数据库的权限管理
    Mysql权限系统非常重要,但同时又是一个很多开发者或管理者所忽略的。权限分配不但,将会造成难以挽回的悲惨后果。我之前所在一家公司,关于数据库权限这块就完全不重视,所有开发者都有线上系统的最高权限。想想看,...
    99+
    2024-04-02
  • MySQL数据库的权限介绍
    本篇内容介绍了“MySQL数据库的权限介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL权限介绍...
    99+
    2024-04-02
  • 基于Mybatis-Plus实现数据权限
    概念 数据权限是指对系统用户进行数据资源可见性的控制。实现不同角色登录系统所展示的操作数据范围不一样,达到角色与角色、用户与用户之间数据的隔离。例如:管理员可以看到所有的菜单,而普通用户只能看到部分菜...
    99+
    2023-09-01
    java spring boot mybatis
  • Mybatisplus数据权限DataPermissionInterceptor怎么实现
    这篇文章主要讲解了“Mybatisplus数据权限DataPermissionInterceptor怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatisplus数据权限Dat...
    99+
    2023-07-02
  • MySQL数据库权限操作
    操作对象: 线上和测试所有MySQL Plus数据库 创建用户: create user 'testname'@'%' identified by '123456'; 查看testname用户的权限 ...
    99+
    2024-04-02
  • MYSQL数据库管理中怎么实现权限管理
    本篇文章为大家展示了MYSQL数据库管理中怎么实现权限管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 MYSQL权限简介关于mysql的权限简单的理解就是m...
    99+
    2024-04-02
  • MySQL 数据类型详情
    目录1、数值类型1.1、数值类型分类1.1.1、浮点数1.1.2、位类型1.1.3、时间日期类型1.1.4、字符串类型1.1.5、ENUM 类型1.1.6、SET类型1、数值类型 1...
    99+
    2024-04-02
  • SpringCloud 微服务数据权限控制的实现
    目录一、 整体架构二、 实现流程三、 实现步骤1. 注解实现2. 注解使用3. 实现AuthStoreSupplier4. 实现AuthQuerySupplier5. 开启数据权限四...
    99+
    2024-04-02
  • MongoDB数据库权限管理详解
    前几天网友问MongoDB数据库权限方面的问题。当时大致的了解了一下,这周仔细了解了一下。对于一个数据库不可能随意的访问,肯定要有写访问限制。 在了解这个之前首先熟悉下shell客户端。打开shell客户端的方法:mon...
    99+
    2022-07-07
    MongoDB数据库 权限管理
  • Mysql 用户权限管理实现
    1. MySQL 权限介绍 mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表,我当前的版本mysql 5.7.22 。 mysql权限表的验证过程为: ...
    99+
    2022-05-25
    Mysql 用户权限管理
  • 数据权限筛选(RLS)的两种实现介绍
      在应用程序中,尤其是在统计的时候, 需要使用数据权限来筛选数据行。 简单的说,张三看张三部门的数据, 李四看李四部门的数据;或者员工只能看自己的数据, 经理可以看部门的数据。这个在微软的文档中叫Row Level Security,字...
    99+
    2018-05-06
    数据权限筛选(RLS)的两种实现介绍
  • MySQL之test数据库默认权限
    默认情况下,mysql.db表中包含的行表示任意用户可以访问test数据库和test_开头的数据库。这些行的User字段的值为空,表示匹配任意用户。这意味着这些数据库(test数据库和test_开头的数...
    99+
    2024-04-02
  • MySQL数据库用户权限管理
    目录1、用户管理1.1、创建用户1.2、删除用户1.3、修改用户密码2、权限管理2.1、授予权限 grant2.2、取消权限 revoke2.3、刷新权限 flush3、密码丢失的解...
    99+
    2024-04-02
  • Springboot实现多数据源切换详情
    目录1. 实现效果1.1 controller1.2 mybatis.xml1.3 application.yml1.4 启动类2. 注解2.1 @Router3. 分库策略3.1 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作