Spring Boot 之 RESRful API 權限控制


一、為何用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM