要做一款許可權架構,就要適用幾個流行的相關框加,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 角色 繫結可操作資源的集合。比如系統管理員,可以使用全部資源.一般使用者,可以...