許可權管理框架實現(1) Struts切面處理

2021-07-11 03:44:12 字數 3853 閱讀 3762

要做一款許可權架構,就要適用幾個流行的相關框加,struts2是我們公司首先需要考慮的,考慮到侵入性,決定通過切面的方式,在每個action前進行許可權驗證,基本思路是:

1,自定義通用許可權註解

2,開發抽象切面,預留傳入uid的介面

3,配置struts切面,做許可權攔截

以下原始碼是對上邊功能的實現:

/**

* 自定義許可權註解

*/@target(elementtype.method)

@retention(retentionpolicy.runtime)

public @inte***ce authority

public abstract class elinterceptor implements interceptor 

protected final log log = logfactory.getlog(this.getclass());

@override

public void init()

/*** 攔截類並作許可權驗證

* @param invocation

* @return

* @throws exception

*/@override

public string intercept(actioninvocation invocation) throws exception else

} else

}log.info("<=intercept=>authority intercept");

if(istest==null ||istest.trim().isempty())else

}private boolean checkonline(authcheckdomain authcheckdomain)

}return ispass;

}private void writejson(string json)catch (exception e)

}private void initauthcode(method methods)

}tovm(result);

}private boolean isauthpass(string authoritycode)

authcheckdomain.setauthcode(authoritycode);

authcheckdomain.setuid(uid);

authcheckdomain.setip(ip);

authcheckdomain.setprovinceid(provinceid);

authcheckdomain.setcityid(cityid);

authcheckdomain.settownid(townid);

boolean ispass = false;

authorityuser authorityuser =null;

if(authcache.authmap!=null && authcache.authmap.containskey(authoritycode) && authcache.authmap.get(authoritycode)!=null )

ispass=checkauth.hasauth(authorityuser,authcheckdomain);

}else

tovmauthpass(authoritycode, ispass);

return ispass;

}private void tovmauthpass(string authcode,boolean ispass)

private void tovm(result result)

}private string getfromvm(string authcode)

private string getdatepickerlocale() else

return locale;

}public locale getlocale() else

}private userareafranchisee getuserarea(long uid)

}catch (exception e)

}elsecatch(exception e)

}return userareafranchisee;

}private userareafranchisee getuserareabydubbo(long uid)catch (exception e)

if(result==null || !result.issuccess() || result.getresult()==null)else

}private long getprovinceid(long uid)

public long getcityid(long uid)

public long gettownid(long uid)

public abstract long getuid();

public abstract string getip();

public iverificationuser getverificationuser()

public void setverificationuser(iverificationuser verificationuser)

public ilogicuserareafranchiseeservice getlogicuserareafranchiseeservice()

public void setlogicuserareafranchiseeservice(ilogicuserareafranchiseeservice logicuserareafranchiseeservice)

}

此處預留了兩個抽象方法,依賴具體客戶端實現,分別是獲取使用者id和獲取ip

public abstract long getuid();

public abstract string getip();

具體切面(抽象類實現)

@service

public class elinterceptorimpl extends elinterceptor

@override

public string getip()

}

注意:struts切面抽象類中,兩個具體的業務服務不能使用spring自動注入,因為spring是掃瞄包下的類,有註解的維護乙個單例的存在,而抽象類不能例項化,所以會報錯,我們可以在具體實現類中,注入兩個屬性,結果是一樣的。

下圖是struts架構的實現,對應到剛剛的配置檔案中,我們就能很容易分辨出切面的切入位置

struts切面的實現,網上有很多例子,大家不防多多參考,本文中的例子主要是給大家交代清楚整體結構,通過這些後台**及配置,我們就能全域性對使用者許可權控制,進行控制,但是還是有些細節,篇幅所限,大家參考後續的文章,其中會介紹valuestack的使用,前台控制項的自動顯隱等。

筆記1 struts簡介及環境配置

一 環境搭建 1 找到struts2開發所需包 struts2 core 2.x.x.jar struts2框架的核心包。xwork 2.x.x.jar xwork類庫,struts2在其上構建。ognl 2.6.x.jar 物件導航語言,struts2通過其讀寫物件的屬性。freemarker 2...

基於Struts的許可權實現

2 許可權的判斷 這一部分有很多中實現方式,一種所有的action繼承baseaction 在baseaction裡面實現,並在沒乙個action裡面去呼叫判斷.另外一種交給struts去判斷 org.apache.struts.action.requestprocessor 裡面有乙個proces...

基於Struts的許可權實現

一 概念介紹 1 資源 可以使用的系統資源.比如註冊使用者是一種資源,修改使用者資訊也是一種資源.資源在系統中呈現為一棵樹.假如使用者管理是乙個節點.使用者註冊,使用者資訊 修改為使用者管理的葉子。葉子具有不可分割性.2 角色 繫結可操作資源的集合。比如系統管理員,可以使用全部資源.一般使用者,可以...