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