自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[189464]]

 一、為何用RESTful API

1.1 RESTful是什么?

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

1.2理解REST有五點(diǎn):

1.資源

2.資源的表述

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

4.統(tǒng)一接口

5.超文本驅(qū)動(dòng)

需要理解詳情,請(qǐng)點(diǎn)[傳送門]

1.3 什么是REST API?

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

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

MVC模式:

REST API模式:

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

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

基本方法定義:

  1. GET /user # 獲取user列表 
  2. GET /user/3 # 查看序號(hào)為3的user 
  3. POST /user # 新建一個(gè)user 
  4. PUT /user/3  # 更新序號(hào)為3的user 
  5. DELETE /user/3 #刪除user 3 

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

  1. GET /admin/1/user/10 # 管理員1號(hào),查看序號(hào)為3的user信息 
  2. ... 

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

二、權(quán)限控制

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

2.1 認(rèn)證

身份認(rèn)證,即登錄驗(yàn)證用戶是否擁有相應(yīng)的身份。簡(jiǎn)單的說就是一個(gè)Web頁面點(diǎn)擊登錄后,服務(wù)端進(jìn)行用戶密碼的校驗(yàn)。

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

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

一般簡(jiǎn)單項(xiàng)目:做個(gè)sign(加密加鹽參數(shù))+ 針對(duì)用戶的access_token

復(fù)雜的話,加入 SLL ,并使用OAuth2進(jìn)行對(duì)token的安全傳輸。

自然,技術(shù)服務(wù)于應(yīng)用場(chǎng)景。既簡(jiǎn)單又可以處理應(yīng)用場(chǎng)景即可。簡(jiǎn)單,實(shí)用即可~

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

3.1 AccessToken 攔截器

  1. /** 
  2.  * Access Token攔截器 
  3.  * <p/> 
  4.  * Created by bysocket on 16/4/18. 
  5.  */ 
  6. @Component 
  7. public class AccessTokenVerifyInterceptor extends HandlerInterceptorAdapter { 
  8.   
  9.     @Autowired 
  10.     ValidationService validationService; 
  11.   
  12.     private final static Logger LOG = LoggerFactory.getLogger(AccessTokenVerifyInterceptor.class); 
  13.   
  14.     @Override 
  15.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
  16.             throws Exception { 
  17.         LOG.info("AccessToken executing ..."); 
  18.         boolean flag = false
  19.         // token 
  20.         String accessToken = request.getParameter("token"); 
  21.         if (StringUtils.isNotBlank(accessToken)) { 
  22.             // 驗(yàn)證 
  23.             ValidationModel v = validationService.verifyAccessToken(accessToken); 
  24.             // 時(shí)間過期 
  25.   
  26.             // 用戶驗(yàn)證 
  27.             if (v != null) { 
  28.                 User user = userService.findById(v.getUid()); 
  29.                 if(user != null) { 
  30.                     request.setAttribute(CommonConst.PARAM_USER, user); 
  31.                     LOG.info("AccessToken SUCCESS ...  user:" + user.getUserName() + " - " + accessToken); 
  32.                     flag = true
  33.                 } 
  34.             } 
  35.         } 
  36.   
  37.         if (!flag) { 
  38.             response.setStatus(HttpStatus.FORBIDDEN.value()); 
  39.             response.getWriter().print("AccessToken ERROR"); 
  40.         } 
  41.   
  42.         return flag; 
  43.     } 

***步:從request獲取token

第二步:根據(jù)token獲取校驗(yàn)對(duì)象信息(也可以加入過期時(shí)間校驗(yàn),簡(jiǎn)單)

第三步:通過校驗(yàn)信息獲取用戶信息

3.2 配置攔截

  1. /** 
  2.  * MVC 設(shè)置 
  3.  * 
  4.  */ 
  5. @Configuration 
  6. public class WebMvcConfig extends WebMvcConfigurerAdapter { 
  7.   
  8.     @Bean 
  9.     public AccessTokenVerifyInterceptor tokenVerifyInterceptor() { 
  10.         return new AccessTokenVerifyInterceptor(); 
  11.     } 
  12.   
  13.     @Override 
  14.     public void addInterceptors(InterceptorRegistry registry) { 
  15.         registry.addInterceptor(tokenVerifyInterceptor()).addPathPatterns("/test"); 
  16.         super.addInterceptors(registry); 
  17.     } 
  18.   

***步:將攔截器配置成Bean

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

token存哪里?

ehcache,redis,db都可以。自然簡(jiǎn)單的當(dāng)然是db。

四、小結(jié)

1. REST API

2. Spring Boot 攔截器

【本文為51CTO專欄作者“李強(qiáng)強(qiáng)”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過51CTO聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2024-09-26 08:03:37

2021-07-09 06:48:29

Spring Boot應(yīng)用Keycloak

2023-05-11 12:40:00

Spring控制器HTTP

2022-08-30 08:50:07

Spring權(quán)限控制

2022-08-15 08:42:46

權(quán)限控制Spring

2022-08-30 08:43:11

Spring權(quán)限控制

2022-08-30 08:36:13

Spring權(quán)限控制

2022-08-30 08:55:49

Spring權(quán)限控制

2022-08-15 08:45:21

Spring權(quán)限控制

2017-04-26 11:00:34

Spring BootHelloWorld詳解

2025-03-13 07:33:46

Spring項(xiàng)目開發(fā)

2024-02-18 12:44:22

2022-01-07 07:29:08

Rbac權(quán)限模型

2024-10-15 09:34:57

2025-04-15 01:00:00

2019-12-03 11:00:08

spring bootspring-kafkJava

2024-05-13 13:13:13

APISpring程序

2025-03-12 02:00:55

API接口優(yōu)化

2020-06-17 08:31:10

權(quán)限控制Spring Secu

2021-07-27 10:49:10

SpringSecurity權(quán)限
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)