摘要: 原創(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