Spring Boot 之 RESTful API 權(quán)限控制 | 泥瓦匠BYSocket

2023-05-10 14:13 更新

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

“簡(jiǎn)單,踏實(shí)~ 讀書(shū)寫(xiě)字放屁”

一、為何用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)是無(wú)狀態(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)很常見(jiàn)呢?請(qǐng)看下面兩個(gè)模式

MVC模式:

 

REST API模式:


 

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

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

基本方法定義:

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

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

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

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

二、權(quán)限控制

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

2.1 認(rèn)證

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

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

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

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

復(fù)雜的話,加入 SSL ,并使用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 攔截器

/**
 * Access Token攔截器
 * <p/>
 * Created by bysocket on 16/4/18.
 */
@Component
public class AccessTokenVerifyInterceptorextends 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)) {
            // 驗(yàn)證
            ValidationModel v = validationService.verifyAccessToken(accessToken);
            // 時(shí)間過(guò)期
            // 用戶驗(yàn)證
            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

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

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

3.2 配置攔截

/**
 * MVC 設(shè)置
 *
 */
@Configuration
public class WebMvcConfigextends WebMvcConfigurerAdapter {
    @Bean
    public AccessTokenVerifyInterceptor tokenVerifyInterceptor() {
        return new AccessTokenVerifyInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(tokenVerifyInterceptor()).addPathPatterns("/test");
        super.addInterceptors(registry);
    }
}
第一步:將攔截器配置成Bean

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

token存哪里?

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

四、小結(jié)

1. REST API

2. Spring Boot 攔截器

 

歡迎點(diǎn)擊我的博客及GitHub — 博客提供RSS訂閱哦!

———- http://www.bysocket.com/ ————-https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket




以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)