權(quán)限控制是每個(gè)項(xiàng)目必不可少的一塊。在最近的一個(gè)MVC模式(Struts)的實(shí)踐當(dāng)中,在進(jìn)行權(quán)限訪問(wèn)控制時(shí)做了一個(gè)這樣的嘗試,即在action當(dāng)中進(jìn)行權(quán)限控制,它所控制的粒度可以到用戶的每個(gè)操作上,比如說(shuō)增刪改查,當(dāng)然,我這里所說(shuō)的權(quán)限是控制到功能級(jí)的,系統(tǒng)還沒(méi)有復(fù)雜到對(duì)實(shí)例級(jí)別的控制。
具體的例子如下:先定義一個(gè)BaseDispatchAction,此類繼承Struts當(dāng)中的DispatchAction,其中有個(gè)權(quán)限檢查的方法
protected boolean checkPermit(HttpServletRequest request, String funcId,String operationId)
funcId指的是當(dāng)前的欄目,operationId為當(dāng)前欄目的功能操作ID,將功能ID與操作ID在checkPermit方法當(dāng)中與當(dāng)前用戶所在的角色資源進(jìn)行判斷,看是否符合當(dāng)前操作。
比如具體到一個(gè)新增操作,可以在相對(duì)應(yīng)的功能操作表中定義對(duì)應(yīng)的操作ID。在接下來(lái)的具體某個(gè)action當(dāng)中,先繼承BaseDispatchAction,比如用戶管理模塊的UserManangeAction。然后在新增方法當(dāng)中加入如下代碼控制,
這樣,對(duì)具體的某個(gè)功能操作就進(jìn)行了很好的控制。
具體的例子如下:先定義一個(gè)BaseDispatchAction,此類繼承Struts當(dāng)中的DispatchAction,其中有個(gè)權(quán)限檢查的方法

funcId指的是當(dāng)前的欄目,operationId為當(dāng)前欄目的功能操作ID,將功能ID與操作ID在checkPermit方法當(dāng)中與當(dāng)前用戶所在的角色資源進(jìn)行判斷,看是否符合當(dāng)前操作。
比如具體到一個(gè)新增操作,可以在相對(duì)應(yīng)的功能操作表中定義對(duì)應(yīng)的操作ID。在接下來(lái)的具體某個(gè)action當(dāng)中,先繼承BaseDispatchAction,比如用戶管理模塊的UserManangeAction。然后在新增方法當(dāng)中加入如下代碼控制,
1
//判斷是否有此方法的操作權(quán)限
2
String funcId = httpServletRequest.getParameter("funcId");
3
if (checkPermit(httpServletRequest, funcId, Constants.QUERY)) {
4
return forwardError(actionMapping, httpServletRequest,"error.checkPermit");
5
}
6

2

3


4

5

6

這樣,對(duì)具體的某個(gè)功能操作就進(jìn)行了很好的控制。