SOA中springmvc中restful服務(wù)的數(shù)據(jù)權(quán)限加密方式分享

restful中數(shù)據(jù)權(quán)限加密方式有很多種,特別是針對(duì)于request json的方式加密,這里詳細(xì)介紹了SOA中針對(duì)于get、post數(shù)據(jù)加密方式薪贫,保證數(shù)據(jù)傳輸中的安全性:

Java代碼

@Component("dataSignInterceptor")

publicclass?DataSignInterceptorimplements?MethodInterceptor?{

@Autowired

private?SoaServiceConfigService?soaServiceConfigService;

@Autowired

private?SoaAppSecretService?soaAppSecretService;

@Autowired

private?SoaServiceApplyService?soaServiceApplyService;

public?Object?invoke(MethodInvocation?mi)throws?Throwable?{

//TODO?此處應(yīng)該先查詢(xún)緩存

//獲取所有未管控的服務(wù)列表

List?soaServiceConfigList?=?soaServiceConfigService.findNoSwitchList();

if(soaServiceConfigList?!=null){

//放入緩存

}

Object[]?ars?=?mi.getArguments();

//?判斷該方法是否加了DataSign?注解

if?(mi.getMethod().isAnnotationPresent(DataSign.class))?{

//?獲取攔截方法的請(qǐng)求參數(shù)

HttpServletRequest?request?=null;

JSONObject?jsonBody?=null;

Map?reqGetParamMap?=null;//?客戶(hù)端傳遞的參數(shù)信息

Map?reqPostParamMap?=null;//?客戶(hù)端傳遞的參數(shù)信息

Map?resultParamMap?=new?HashMap();

for?(Object?obj?:?ars)?{

if?(objinstanceof?HttpServletRequest)?{

request?=?(HttpServletRequest)?obj;

reqGetParamMap?=?(Map)?request.getParameterMap();

Set?keSet?=?reqGetParamMap.entrySet();

for?(Iterator?itr?=?keSet.iterator();?itr.hasNext();)?{

Map.Entry?me?=?(Map.Entry)?itr.next();

String?key?=?me.getKey().toString();

Object?ov?=?me.getValue();

String[]?value?=new?String[1];

if(ovinstanceof?String[]){

value=(String[])ov;

}else{

value[0]=ov.toString();

}

resultParamMap.put(key,?value[0]);

}

}elseif?(objinstanceof?JSONObject)?{

jsonBody?=?(JSONObject)?obj;

ObjectMapper?objMap?=new?ObjectMapper();

reqPostParamMap?=?objMap.readValue(jsonBody.toString(),?Map.class);

resultParamMap?=?reqPostParamMap;

}

}

String?serviceUrl?=?request.getServletPath();

if(StringUtils.isNotEmpty(serviceUrl)){

serviceUrl?=?serviceUrl.substring(serviceUrl.indexOf("/",2));

}

//TODO?應(yīng)該從緩存取,當(dāng)前先這樣處理

//如果所有未管控的服務(wù)列表中包含用戶(hù)請(qǐng)求的服務(wù)連接刻恭,則不需要再進(jìn)行管控瞧省,直接放開(kāi)服務(wù)控制權(quán)

if(soaServiceConfigList?!=null){

for(SoaServiceConfig?soaServiceConfig?:?soaServiceConfigList){

if(serviceUrl.equals(soaServiceConfig.getServiceUrl())){

return?mi.proceed();

}

}

}

String?reqSign?=?resultParamMap.get("sign");//?客戶(hù)端傳遞的簽名認(rèn)證信息

//?驗(yàn)證簽名不能為空

if?(StringUtils.isEmpty(reqSign))?{

returnnew?ResponseVO(DataSignEnum.SIGN_NOT_NULL.getCode(),?DataSignEnum.SIGN_NOT_NULL.getMessage(),

null);

}

String?appname?=?resultParamMap.get("appname");

//?驗(yàn)證應(yīng)用名不能為空

if?(StringUtils.isEmpty(appname))?{

returnnew?ResponseVO(DataSignEnum.APPNAME_NOT_NULL.getCode(),

DataSignEnum.APPNAME_NOT_NULL.getMessage(),null);

}

SoaServiceApply?soaServiceApply?=?soaServiceApplyService.getServiceApplyByAppname(serviceUrl,?appname);

if(null?==?soaServiceApply){

returnnew?ResponseVO(DataSignEnum.APPNAME_NOT_APPLY.getCode(),

DataSignEnum.APPNAME_NOT_APPLY.getMessage(),null);

}

SoaAppSecret?soaAppSecret?=?soaAppSecretService.findAppSecretByAppName(appname);

if(null?==?soaAppSecret){

returnnew?ResponseVO(DataSignEnum.APPNAME_NOT_EXISTS.getCode(),

DataSignEnum.APPNAME_NOT_EXISTS.getMessage(),null);

}

//?根據(jù)參數(shù)重新生成新的簽名sign(因?yàn)閟ign不能認(rèn)為是業(yè)務(wù)參數(shù),故將sign從map中移除后再加密)

resultParamMap.remove("sign");

resultParamMap.put("token",?soaAppSecret.getToken());

String?sign?=?MD5Utils.paramString(resultParamMap);

//?根據(jù)應(yīng)用名獲取應(yīng)用名對(duì)應(yīng)的秘鑰(目的是和url請(qǐng)求的參數(shù)一起進(jìn)行簽名認(rèn)證)

if?(!StringUtils.equals(sign,?reqSign))?{

returnnew?ResponseVO(DataSignEnum.SIGN_NOT_MATCH.getCode(),?DataSignEnum.SIGN_NOT_MATCH.getMessage(),

null);

}

}

//?執(zhí)行被攔截的方法鳍贾,切記鞍匾,如果此方法不調(diào)用,則被攔截的方法不會(huì)被執(zhí)行骑科。

return?mi.proceed();

}

/**

*?數(shù)據(jù)簽名枚舉

*

*?@author?Administrator

*/

publicenum?DataSignEnum?{

SIGN_NOT_NULL(2001,"簽名不能為空."),

SIGN_NOT_MATCH(2002,"簽名不匹配橡淑,傳遞的數(shù)據(jù)被篡改過(guò)."),

APPNAME_NOT_NULL(2003,"應(yīng)用名不能為空."),

APPNAME_NOT_EXISTS(2004,"應(yīng)用名不存在."),

APPNAME_NOT_APPLY(2005,"當(dāng)前應(yīng)用沒(méi)有權(quán)限訪問(wèn)此服務(wù),請(qǐng)聯(lián)系管理員進(jìn)行服務(wù)申請(qǐng).");

//?成員變量

privateint?code;//?狀態(tài)碼

private?String?message;//?返回消息

//?構(gòu)造方法

private?DataSignEnum(int?code,?String?message)?{

this.code?=?code;

this.message?=?message;

}

publicint?getCode()?{

return?code;

}

publicvoid?setCode(int?code)?{

this.code?=?code;

}

public?String?getMessage()?{

return?message;

}

publicvoid?setMessage(String?message)?{

this.message?=?message;

}

}

}

愿意了解框架技術(shù)或者源碼的朋友直接求求交流分享技術(shù):3133806896

分布式的一些解決方案咆爽,有愿意了解的朋友可以找我們團(tuán)隊(duì)探討

更多詳細(xì)源碼參考來(lái)源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梁棠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斗埂,更是在濱河造成了極大的恐慌符糊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呛凶,死亡現(xiàn)場(chǎng)離奇詭異男娄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)模闲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)建瘫,“玉大人,你說(shuō)我怎么就攤上這事围橡∨欤” “怎么了缕贡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵翁授,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我晾咪,道長(zhǎng)收擦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任谍倦,我火速辦了婚禮塞赂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昼蛀。我一直安慰自己宴猾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布叼旋。 她就那樣靜靜地躺著仇哆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夫植。 梳的紋絲不亂的頭發(fā)上讹剔,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音详民,去河邊找鬼延欠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沈跨,可吹牛的內(nèi)容都是我干的由捎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼饿凛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狞玛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起笤喳,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤为居,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后杀狡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蒙畴,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膳凝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碑隆。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹬音,靈堂內(nèi)的尸體忽然破棺而出上煤,到底是詐尸還是另有隱情,我是刑警寧澤著淆,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布劫狠,位于F島的核電站,受9級(jí)特大地震影響永部,放射性物質(zhì)發(fā)生泄漏独泞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一苔埋、第九天 我趴在偏房一處隱蔽的房頂上張望懦砂。 院中可真熱鬧,春花似錦组橄、人聲如沸荞膘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至卵牍,卻和暖如春瓮栗,著一層夾襖步出監(jiān)牢的瞬間削罩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工费奸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弥激,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓愿阐,卻偏偏與公主長(zhǎng)得像微服,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缨历,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容