1. 程式人生 > >Spring boot 那些事之RESRful API 許可權控制

Spring boot 那些事之RESRful API 許可權控制

Spring boot 那些事之RESRful API 許可權控制

Spring boot 那些事之RESRful API 許可權控制

泥瓦匠BYSocket

泥瓦匠BYSocket

生活者

39 人讚了該文章

Spring Boot,支援約定優於配置,讓開發人員儘快啟動並執行專案。針對 Spring Boot 的學習和總結準備寫系列文章。

程式碼共享在【springboot-learning-example】,spring boot 實踐學習案例,是 spring boot 初學者及核心技術鞏固的最佳實踐。

文章安排如下:

  • 《Spring Boot 之 RESRful API 許可權控制》
  • 《Spring Boot 之 HelloWorld 詳解》
  • 《Springboot 整合 Mybatis 的完整 Web 案例》
  • 《Springboot 實現 Restful 服務,基於 HTTP / JSON 傳輸》
  • 《Springboot 整合 FreeMarker》
  • 《Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例》
  • 《Springboot 整合 Redis 實現快取》
  • 《Springboot 整合 Druid 資料連線池》
  • 《Springboot 整合 Shiro 完成授權》
  • 《Springboot 實現 Mybatis 多資料來源配置》

 

—————————————————————————————————————————

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針對資源的方法定義分簡單和關聯複雜兩種。

基本方法定義:

GET /user # 獲取user列表
GET /user/3 # 檢視序號為3的user
POST /user # 新建一個user
PUT /user/3  # 更新序號為3的user
DELETE /user/3 #刪除user 3

資源之間的關聯方法如下定義:

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 攔截器

/**
 * 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 配置攔截

/**
 * 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 攔截器

原創出處: 泥瓦匠BYSocket | 01001000-01001111-01001101-01000101 泥瓦匠BYSocket 希望轉載,保留摘要,謝謝!