1后雷、使用 query filter
先舉例說明一下數(shù)據(jù)權限迷扇,假設一個工作任務應用有以下的需求:
普通員工可以查看自己的工作項
部門經(jīng)理可以查看自己管理部門的所有工作項
對于普通員工和部門經(jīng)理狮杨,他們訪問應用的入口都是相同的,應用需要根據(jù)不同的角色返回不一樣的數(shù)據(jù)結果,這就是數(shù)據(jù)權限控制。
數(shù)據(jù)權限是個比較復雜的問題般婆,規(guī)則非常靈活,在Leap中并沒有內置實現(xiàn)眨八,但提供了一個基礎機制腺兴,可以相對簡單的實現(xiàn)數(shù)據(jù)權限左电。
1.1 查詢過濾器(Query Filter)
查詢過濾器是 ORM 模塊中的功能廉侧,默認是關閉的,開啟后所有的查詢語句都會在 where 語句的最后自動加上類似 @filter(User) 的表達式篓足。
假設執(zhí)行查詢語句:
select * from user u where u.name = :name
那么開啟 Query Filter 后將會自動變?yōu)椋?/p>
select * from user u where ( u.name = :name ){? and ( @filter(User) )}
關于查詢過濾器的細節(jié)在這里不展開細說段誊,下面具體說明如何使用查詢過濾器實現(xiàn)數(shù)據(jù)權限。
1.2 基于 Query Filter 實現(xiàn)數(shù)據(jù)權限
1.3 開啟
修改 src/main/resources/conf/config.xml 栈拖,增加以下配置屬性:
<properties prefix="orm">
<property name="query_filter.enabled" value="true"/>
</properties>
1.4 實現(xiàn)
編寫類 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;
}
}
返回的表達式語法請看數(shù)據(jù)訪問章節(jié)连舍,其中別名 t. 是固定寫法,在執(zhí)行中會被替換為真正的別名涩哟。
配置 bean 生效:
<bean name="filter" type="leap.orm.sql.SqlTagProcessor" class="hello.beans.SecurityQueryFilter"/>
2.使用sqlMAP進行sql拼接
其原理也是sql拼接 不寫了