权限系统_数据权限控制

1、使用 query filter

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

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

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

1.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) )}
关于查询过滤器的细节在这里不展开细说,下面具体说明如何使用查询过滤器实现数据权限。

1.2 基于 Query Filter 实现数据权限

1.3 开启

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




1.4 实现

编写类 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 生效:

2.使用sqlMAP进行sql拼接
其原理也是sql拼接 不写了

参考地址:http://leapframework.org/doc/security/op_perm.html

你可能感兴趣的:(权限系统_数据权限控制)