MySQL数据权限的实现详情

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

数据权限模型

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

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

实现效果

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

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

  • 给一个角色勾选授权维度实际上是在限制这个角色所能看到的数据范围
  • 任何一个授权维度勾选了"全部",相当于不限制此维度的权限。
    • 如果一个角色勾选了客户群的全部 + 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条件连接符,你们可以根据实际业务场景进行补充。

数据模型

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

这里的组件大家完全可以理解成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语句。

实现过程

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

代码实现

自定义数据权限注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
@Documented
public @interface DataPermission {
	/**
	 * 数据权限类型
	 * 1 上下级授权  2 数据范围授权
	 */
	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";
   /**
	 * 往链接请求里面,传入数据查询条件
	 * @param request
	 * @param componentRules
	 */
	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> {

    /**
     * 根据 用户域账户和组件编码 获取组件对应的关系
     *
     * @param userName      域账号
     * @param componentCode 组件编码
     * @return 用户的所有规则
     */
    List<RoleComponentRuleDTO> getRoleComponentRule(String userName, String componentCode);
}
@Service
public class RoleComponentRuleServiceImpl extends ServiceImpl<RoleComponentRuleMapper, RoleComponentRule> implements RoleComponentRuleService {

    @Resource
    private RoleComponentRuleMapper roleComponentRuleMapper;

    /**
     * 根据 用户域账户和组件编码 获取组件对应的关系
     * @param userName      域账号
     * @param componentCode 组件编码
     * @return 用户的所有规则
     */
    @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) ";

    /**
     * 获取带有数据权限的SQL
     * @param identityId 身份ID
     */
    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());
    }

    /**
     * 构建单角色SQL
     */
    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();
    }

    /**
     * 将单一规则转化成SQL,默认全部使用 In
     * ruleCode : area_test
     * ruleValue : 区域1,区域2,区域3
     * @param rule 规则值
     */
    private static String convertRuleToSql(RoleComponentRuleDTO rule) {
        String whereCondition = " in ";
        String ruleValueConvert = getInConditionValue(rule.getRuleValue());
        return rule.getRuleCode() + whereCondition + ruleValueConvert;
    }

    /**
     * IN字符串转换
     * 区域1, 区域2, 区域3  --> ("区域1","区域2","区域3")
     * 江西大区  --> ("江西大区")
     */
    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) + ")";
    }

    /**
     * 拼接单角色的SQL
     * @param sqlBuilder 总的SQL
     * @param roleSql    单角色SQL
     */
    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));
        }
    }

    /**
     *
     * 1. 对当前身份根据规则编码分组-去除不同角色中相同编码且规则值为ALL的规则
     * 2. 对角色进行分组
     * @param conditionList 数据规则
     * @return 分组后的规则list
     */
    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数据权限内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql创建本地用户及赋予数据库权限的方法示例

    前言 大家在安装 mysql 时通常会生成一个超级用户 root,很多人之后就一直沿用这一个用户,虽然这会很方便,但超级用户权限太大,在所有地方使用它通常是一个安全隐患. 这一点跟操作系统的用户管理也是类似的,多数人贪图方便都直接使用 administrator 或 root 用户,其实是一种不建议的做法. 那么,要如何在 mysql 中创建 root 之外的用户并赋予相应权限呢? 我们直接来看一个示例: CREATE USER 'golden'@'localhost' IDENTIFIED B

  • mysql数据库添加用户及分配权限具体实现

    创建用户并分配权限: 复制代码 代码如下: insert into mysql.user(Host,User,Password) values("localhost","phplamp",password("1234"));//创建用户 grant all privileges on dbname.* to 'username'@'%' identified by 'password';//创建用户并分配所有权限 grant select,upd

  • MySql设置指定用户数据库查看查询权限

    一.新建用户: 1.执行sql语句新建(推荐): INSERT INTO `mysql`.`user` ( `Host`, `User`, `Password`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `authentication_string` ) VALUES ( '%', -- 允许远程访问 'zhangsan', -- 用户名 '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9', -- 明文密码:1

  • 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Dockerfile和shell脚本实现这一过程. 搭建步骤 1.首先创建Dckerfile: FROM mysql:5.7 #设置免密登录 ENV MYSQL_ALLOW_EMPTY_PASSWORD yes #将所需文件放到容器中 COPY setup.sh /mysql/setup.sh COPY sch

  • MySQL数据库远程访问权限如何打开(两种方法)

    下载GPL版本安装 MySQL Community Edition(GPL) Community (GPL) Downloads » 在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户没有远程访问的权限. 下面介绍两种方法,解决这一问题. 1.改表法 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "

  • MySql添加新用户及为用户创建数据库和给用户分配权限方法介绍

    1.添加新用户 只允许本地IP访问 create user 'test'@'localhost' identified by '123456'; 允许外网IP访问 create user 'test'@'%' identified by '123456'; 刷新授权 flush privileges; 2.为用户创建数据库 create database test DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 3.为用户分配权限 授予用户通过外网IP

  • MySQL数据权限的实现详情

    目录 数据权限模型 实现效果 数据模型 数据权限表结构 授权维度表 具体授权维度表(产品线) 组件路由表 角色表 角色组件绑定表 角色组件授权规则表(核心) 实现过程 代码实现 自定义数据权限注解 定义数据权限处理切面 数据权限工具类 查询组件规则 Controller调用 构建数据权限SQL Dao层实现 小结 数据权限模型 上篇文章的数据模型是基于传统的RBAC模型来设计的,由于我们这里的应用场景不一样,所以这里的数据权限模型并没有严格按照上篇文章的方案来设计,但是万变不离其宗,核心原理还是

  • 由于mysql运行权限导致无法找到 Discuz! 论坛数据表! 的解决方法

    无法找到 Discuz! 论坛数据表! 在5.5升级到6.0时,上传完后,运行http://*****.com/upgrade9.php 时出下下列问题: 无法找到 Discuz! 论坛数据表! 请修改 config.inc.php 当中关于数据库的设置,然后上传到论坛目录,重新开始升级 config.inc.php 这个文件我用的是以前的,应该没有问题的. 解决方法:刷新N次,就好了.真是不明白为什么. 发现了,原理mysql的权限是普通用户权限,我们可以先将权限设为系统帐户,问题就可以解决了

  • mysql 数据插入和更新及删除详情

    目录 1.插入 2.更新 3.删除 1.插入 INSERT INTO customers( customers.cust_address, customers.cust_city, customers.cust_state, customers.cust_zip, customers.cust_country, customers.cust_contact, customers.cust_email ) VALUES('zhangsan','good','111','ca','dasdsa','

  • MySQL用户和数据权限管理详解

    目录 1.管理用户 1.1.添加用户 1.2.删除用户 1.3.修改用户名 1.4.修改密码 2.授予权限和回收权限 2.1.授予权限 2.2.权限的转移和限制 2.3.回收权限 1.管理用户 1.1.添加用户 可以使用CREATE USER语句添加一个或多个用户,并设置相应的密码 语法格式: CREATE USER 用户名 [IDENTIFIED BY [PASSWORD]'密码'] CREATE USER用于创建新的MySQL账户.CREATE USER会在系统本身的mysql数据库的use

  • Mysql和文件系统的关联详情

    目录 前言 Mysql数据目录 数据目录相关结构 数据库存储结构 表结构存储 表数据存储 InnoDB存储引擎表数据存储 MyISAM存储引擎表数据存储 特殊视图存储 前言 在Linux中采用文件系统管理磁盘,而Mysql常用的存储引擎如InnoDB.MyISAM采用的是文件存储,自然和文件系统挂钩,那么Mysql都有哪些地方用到了文件系统呢?下面聊聊 Mysql数据目录 Mysql系统启动文件(默认my.cnf)中可能会指定Mysql的一个全局系统变量datadir,这个变量可以指定Mysql

  • MySQL用户权限管理详解

    用户权限管理主要有以下作用: 1. 可以限制用户访问哪些库.哪些表 2. 可以限制用户对哪些表执行SELECT.CREATE.DELETE.DELETE.ALTER等操作 3. 可以限制用户登录的IP或域名 4. 可以限制用户自己的权限是否可以授权给别的用户 一.用户授权 复制代码 代码如下: mysql> grant all privileges on *.* to 'yangxin'@'%' identified by 'yangxin123456' with grant option;  

  • 讲解Linux系统下如何自动备份MySQL数据的基本教程

    1.先创建一个数据库备份目录: mkdir backup cd backup mkdir mysqlbackup cd mysqlbackup 2.创建备份脚本 vi mysqlautobackup 3.编写脚本: filename=`date +%Y%m%d` /mysql的bin目录/mysqldump --opt 数据库名 -u(mysql账号) -p(mysql密码) | gzip > /备份到哪个目录/name$filename.gz 说明:以上采用gzip压缩,name可随意写,注意

  • MySQL用户权限验证与管理方法详解

    本文实例讲述了MySQL用户权限验证与管理方法.分享给大家供大家参考,具体如下: 一.Mysql权限分两阶段验证 1. 服务器检查是否允许连接:用户名.密码,主机地址. 2. 检查每一个请求是否有权限实施. 二.Mysql权限列表 权限 权限级别 权限说明 create 数据库.表或索引 创建数据库.表或索引权限 drop 数据库或表 删除数据库或表权限 grant option 数据库.表或保存的程序 赋予权限选项 references 数据库或表 外键权限 alter 表 更改表,比如添加字

  • Java如何利用Mybatis进行数据权限控制详解

    前言 权限控制主要分为两块,认证(Authentication)与授权(Authorization).认证之后确认了身份正确,业务系统就会进行授权,现在业界比较流行的模型就是RBAC(Role-Based Access Control).RBAC包含为下面四个要素:用户.角色.权限.资源.用户是源头,资源是目标,用户绑定至角色,资源与权限关联,最终将角色与权限关联,就形成了比较完整灵活的权限控制模型. 资源是最终需要控制的标的物,但是我们在一个业务系统中要将哪些元素作为待控制的资源呢?我将系统中

  • 利用phpmyadmin设置mysql的权限方法

    第一步:登陆root用户. 第二步:新建一个数据表,并且选好排序规则,此处我使用testtable. 第三步:我们新建一个用户输入相关的账户名以及密码就可以. 第四步:我们对刚才添加的用户 testuser 编辑权限: 进入页面之后,我们只需选择按数据库制定权限.全局权限不用勾选. 点击之后会出现一个权限页面,全选执行即可. 此时我们登陆的testuser后看见的就只有testtable库,以及此表的相关操作权限. 总结 以上所述是小编给大家介绍的利用phpmyadmin设置mysql的权限方法

随机推荐