基于Mybatis的数据权限方案

606 阅读1分钟

可以自定义 Mybatis 拦截器改写 SQL 支持数据权限,该文提供另一种相对简单的方式支持数据权限。通过 Mybatis 的 sql、include、bind 标签实现动态生成 SQL 过滤数据,其中 Mybatis 可以调用静态方法,但在 include 标签里无法在调用静态方式时传递 include 参数。目前只找到利用 bind 标签把 include 参数绑定到变量,从而可以在调用静态方法时传递 include 参数。

数据权限SQL生成工具类

public class DataAuthHelper {

    public static String generateSql(String tableName, String aliasName) {
        // TODO 生成数据权限SQL
    }

}

Mybatis SQL片段

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jasmine.DataAuth">

    <sql id="autoSql">
        <bind name="_tableName" value="'${tableName}'"/>
        <bind name="_aliasName" value="'${aliasName}'"/>
        ${@jasmine.framework.persistence.mybatisplus.generator.DataAuthHelper@generateSql(_tableName, _aliasName)}
    </sql>

</mapper>

使用 include 标签包含数据权限SQL

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxxx.xxxx.xxxx">

    <select id="xxxx" resultMap="xxxx">
        select t.* from xxxx t
        where t.xxxx = xxxx
        <inclue refid="jasmine.DataAuth.autoSql">
            <property name="tableName" value="xxxx" />
            <property name="aliasName" value="t" />
        </include>
    </select>

</mapper>

直接调用静态方法降低代码可读性

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxxx.xxxx.xxxx">

    <select id="xxxx" resultMap="xxxx">
        select t.* from xxxx t
        where t.xxxx = xxxx
        ${@jasmine.framework.persistence.mybatisplus.generator.DataAuthHelper@generateSql('xxxx', 't')}
    </select>

</mapper>