Spring Boot 之 RESRful API 權(quán)限控制

摘要: 原創(chuàng)出處:www.bysocket.com 泥瓦匠BYSocket 希望轉(zhuǎn)載,保留摘要,謝謝!

“簡單,踏實~ 讀書寫字放屁”

一、為何用RESTful API

1.1 RESTful是什么?

RESTful(Representational State Transfer)架構(gòu)風格,是一個Web自身的架構(gòu)風格,底層主要基于HTTP協(xié)議(ps:提出者就是HTTP協(xié)議的作者),是分布式應用架構(gòu)的偉大實踐理論。RESTful架構(gòu)是無狀態(tài)的,表現(xiàn)為請求-響應的形式,有別于基于Bower的SessionId不同。

1.2理解REST有五點:

1.資源

2.資源的表述

3.狀態(tài)的轉(zhuǎn)移

4.統(tǒng)一接口

5.超文本驅(qū)動

需要理解詳情,請點[傳送門]

1.3 什么是REST API?

基于RESTful架構(gòu)的一套互聯(lián)網(wǎng)分布式的API設(shè)計理論。和上面資源,狀態(tài)和統(tǒng)一接口有著密切的關(guān)系。

為啥分布式互聯(lián)網(wǎng)架構(gòu)很常見呢?請看下面兩個模式

MVC模式:

REST API模式:

1.4 權(quán)限怎么控制?

RESTful針對資源的方法定義分簡單和關(guān)聯(lián)復雜兩種。

基本方法定義:

GET /user # 獲取user列表

GET /user/3# 查看序號為3的user

POST /user # 新建一個user

PUT /user/3# 更新序號為3的user

DELETE /user/3#刪除user3

資源之間的關(guān)聯(lián)方法如下定義:

2GET /admin/1/user/10# 管理員1號,查看序號為3的user信息

...

那么權(quán)限如何控制?

二、權(quán)限控制

前面說到,RESTful是無狀態(tài)的,所以每次請求就需要對起進行認證和授權(quán)。

2.1 認證

身份認證,即登錄驗證用戶是否擁有相應的身份。簡單的說就是一個Web頁面點擊登錄后,服務端進行用戶密碼的校驗。

2.2 權(quán)限驗證(授權(quán))

也可以說成授權(quán),就是在身份認證后,驗證該身份具體擁有某種權(quán)限。即針對于某種資源的CRUD,不同用戶的操作權(quán)限是不同的。

一般簡單項目:做個sign(加密加鹽參數(shù))+ 針對用戶的access_token

復雜的話,加入 SLL ,并使用OAuth2進行對token的安全傳輸。

自然,技術(shù)服務于應用場景。既簡單又可以處理應用場景即可。簡單,實用即可~

三、Access Token權(quán)限解決

3.1 AccessToken 攔截器

/**

* Access Token攔截器

*

* Created by bysocket on 16/4/18.

*/

@Component

publicclassAccessTokenVerifyInterceptorextendsHandlerInterceptorAdapter {

@Autowired

ValidationService validationService;

privatefinalstaticLogger LOG = LoggerFactory.getLogger(AccessTokenVerifyInterceptor.class);

@Override

publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throwsException {

LOG.info("AccessToken executing ...");

booleanflag =false;

// token

String accessToken = request.getParameter("token");

if(StringUtils.isNotBlank(accessToken)) {

// 驗證

ValidationModel v = validationService.verifyAccessToken(accessToken);

// 時間過期

// 用戶驗證

if(v !=null) {

User user = userService.findById(v.getUid());

if(user !=null) {

request.setAttribute(CommonConst.PARAM_USER, user);

LOG.info("AccessToken SUCCESS ...? user:"+ user.getUserName() +" - "+ accessToken);

flag =true;

}

}

}

if(!flag) {

response.setStatus(HttpStatus.FORBIDDEN.value());

response.getWriter().print("AccessToken ERROR");

}

returnflag;

}

}

第一步:從request獲取token

第二步:根據(jù)token獲取校驗對象信息(也可以加入過期時間校驗,簡單)

第三步:通過校驗信息獲取用戶信息

3.2 配置攔截

/**

* MVC 設(shè)置

*

*/

@Configuration

publicclassWebMvcConfigextendsWebMvcConfigurerAdapter {

@Bean

publicAccessTokenVerifyInterceptor tokenVerifyInterceptor() {

returnnewAccessTokenVerifyInterceptor();

}

@Override

publicvoidaddInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(tokenVerifyInterceptor()).addPathPatterns("/test");

super.addInterceptors(registry);

}

}

第一步:將攔截器配置成Bean

第二步:攔截器注冊注入該攔截器,并配置攔截的URL

token存哪里?

ehcache,redis,db都可以。自然簡單的當然是db。

四、小結(jié)

1. REST API

2. Spring Boot 攔截器

歡迎點擊我的博客及GitHub — 博客提供RSS訂閱哦!———-http://www.bysocket.com/————-https://github.com/JeffLi1993———-

微???????? 博:BYSocket豆???????? 瓣:BYSocketFaceBook:BYSocketTwitter??? :BYSocket

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,466評論 1 23
  • 注意:本文中代碼均使用 Qt 開發(fā)編譯環(huán)境,如有疑問和建議歡迎隨時留言。 模板是 C++ 支持參數(shù)化程序設(shè)計的工具...
    趙者也閱讀 5,878評論 1 5
  • 最近想的有點多,審視自己,發(fā)現(xiàn)自己在走下坡路,連我也不知道什么時候開始,居然喪失了一種那種不服輸?shù)挠職狻?自省其實...
    木子不愛糖閱讀 727評論 4 3
  • 我記得我在小學五年級時因一個班級歌唱比賽而喜歡你們的!有幾位同學選了你們的一首歌,魔法城堡,當時我覺得這三個少年唱...
    CherrySoon_d522閱讀 323評論 0 0

友情鏈接更多精彩內(nèi)容