数据权限控制

先举例说明一下数据权限,假设一个工作任务应用有以下的需求:

  • 普通员工可以查看自己的工作项
  • 部门经理可以查看自己管理部门的所有工作项

对于普通员工和部门经理,他们访问应用的入口都是相同的,应用需要根据不同的角色返回不一样的数据结果,这就是数据权限控制。

数据权限是个比较复杂的问题,规则非常灵活,在Leap中并没有内置实现,但提供了一个基础机制,可以相对简单的实现数据权限。

1. 查询过滤器(Query Filter)

查询过滤器是 ORM 模块中的功能,默认是关闭的,开启后所有的查询语句都会在 where 语句的最后自动加上类似 @filter(User) 的表达式。

假设执行查询语句:

select * from user u where u.name = :name

那么开启 Query Filter 后将会自动变为:

select * from user u where ( u.name = :name ){? and ( @filter(User) )}

关于查询过滤器的细节在这里不展开细说,下面具体说明如何使用查询过滤器实现数据权限。

2. 基于 Query Filter 实现数据权限

2.1. 开启

修改 src/main/resources/conf/config.xml ,增加以下配置属性:

<properties prefix="orm">
        <property name="query_filter.enabled" value="true"/>
</properties>

2.2. 实现

编写类 SecurityQueryFilter.java

package hello.beans;
import leap.lang.params.Params;
import leap.orm.sql.Sql;
import leap.orm.sql.SqlContext;
import leap.orm.sql.SqlTag;
import leap.orm.sql.SqlTagProcessor;
public class SecurityQueryFilter implements SqlTagProcessor {

    @Override
    public String processTag(SqlContext context, Sql sql, SqlTag tag, Params params) {
        String entityName = tag.getContent();
        if(entityName.equals("User")) {
            return "t.id = #{env.user.id}";
        }
        return null;
    }
}

返回的表达式语法请看数据访问章节,其中别名 t. 是固定写法,在执行中会被替换为真正的别名。

配置 bean 生效:

<bean name="filter" type="leap.orm.sql.SqlTagProcessor" class="hello.beans.SecurityQueryFilter"/>
上一篇:操作权限控制 下一篇:生成操作日志

results matching ""

    No results matching ""