一、為何用RESTful API
1.1 RESTful是什么?
RESTful(Representational State Transfer)架構風格,是一個Web自身的架構風格,底層主要基於HTTP協議(ps:提出者就是HTTP協議的作者),是分布式應用架構的偉大實踐理論。RESTful架構是無狀態的,表現為請求-響應的形式,有別於基於Bower的SessionId不同。
1.2理解REST有五點:
1.資源
2.資源的表述
3.狀態的轉移
4.統一接口
5.超文本驅動
需要理解詳情,請點[傳送門]
1.3 什么是REST API?
基於RESTful架構的一套互聯網分布式的API設計理論。和上面資源,狀態和統一接口有着密切的關系。
為啥分布式互聯網架構很常見呢?請看下面兩個模式
MVC模式:
REST API模式:
1.4 權限怎么控制?
RESTful針對資源的方法定義分簡單和關聯復雜兩種。
基本方法定義:
1
2
3
4
5
|
GET /user # 獲取user列表
GET /user/
3
# 查看序號為
3
的user
POST /user # 新建一個user
PUT /user/
3
# 更新序號為
3
的user
DELETE /user/
3
#刪除user
3
|
資源之間的關聯方法如下定義:
1
2
|
GET /admin/
1
/user/
10
# 管理員
1
號,查看序號為
3
的user信息
...
|
那么權限如何控制?
二、權限控制
前面說到,RESTful是無狀態的,所以每次請求就需要對起進行認證和授權。
2.1 認證
身份認證,即登錄驗證用戶是否擁有相應的身份。簡單的說就是一個Web頁面點擊登錄后,服務端進行用戶密碼的校驗。
2.2 權限驗證(授權)
也可以說成授權,就是在身份認證后,驗證該身份具體擁有某種權限。即針對於某種資源的CRUD,不同用戶的操作權限是不同的。
一般簡單項目:做個sign(加密加鹽參數)+ 針對用戶的access_token
復雜的話,加入 SLL ,並使用OAuth2進行對token的安全傳輸。
自然,技術服務於應用場景。既簡單又可以處理應用場景即可。簡單,實用即可~
三、Access Token權限解決
3.1 AccessToken 攔截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
/**
* Access Token攔截器
* <p/>
* Created by bysocket on 16/4/18.
*/
@Component
public
class
AccessTokenVerifyInterceptor
extends
HandlerInterceptorAdapter {
@Autowired
ValidationService validationService;
private
final
static
Logger LOG = LoggerFactory.getLogger(AccessTokenVerifyInterceptor.
class
);
@Override
public
boolean
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws
Exception {
LOG.info(
"AccessToken executing ..."
);
boolean
flag =
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"
);
}
return
flag;
}
}
|
第一步:從request獲取token
第二步:根據token獲取校驗對象信息(也可以加入過期時間校驗,簡單)
第三步:通過校驗信息獲取用戶信息
3.2 配置攔截
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/**
* MVC 設置
*
*/
@Configuration
public
class
WebMvcConfig
extends
WebMvcConfigurerAdapter {
@Bean
public
AccessTokenVerifyInterceptor tokenVerifyInterceptor() {
return
new
AccessTokenVerifyInterceptor();
}
@Override
public
void
addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(tokenVerifyInterceptor()).addPathPatterns(
"/test"
);
super
.addInterceptors(registry);
}
}
|
第一步:將攔截器配置成Bean
第二步:攔截器注冊注入該攔截器,並配置攔截的URL
token存哪里?
ehcache,redis,db都可以。自然簡單的當然是db。
四、小結
1. REST API
2. Spring Boot 攔截器
http://www.bysocket.com/?p=1080