Spring Boot 之 RESRful API 權限控制

摘要: 原創出處:www.bysocket.com 泥瓦匠BYSocket 但願轉載,保留摘要,謝謝!java

「簡單,踏實~ 讀書寫字放屁」git

1、爲什麼用RESTful API

1.1 RESTful是什麼?

RESTful(Representational State Transfer)架構風格,是一個Web自身的架構風格,底層主要基於HTTP協議(ps:提出者就是HTTP協議的做者),是分佈式應用架構的偉大實踐理論。RESTful架構是無狀態的,表現爲請求-響應的形式,有別於基於Bower的SessionId不一樣。github

 

1.2理解REST有五點:

1.資源 redis

2.資源的表述 安全

3.狀態的轉移 restful

4.統一接口 架構

5.超文本驅動socket

須要理解詳情,請點[傳送門]分佈式

 

1.3 什麼是REST API?

基於RESTful架構的一套互聯網分佈式的API設計理論。和上面資源,狀態和統一接口有着密切的關係。ide

爲啥分佈式互聯網架構很常見呢?請看下面兩個模式

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信息
...

那麼權限如何控制? 

2、權限控制

前面說到,RESTful是無狀態的,因此每次請求就須要對起進行認證和受權。

2.1 認證

身份認證,即登陸驗證用戶是否擁有相應的身份。簡單的說就是一個Web頁面點擊登陸後,服務端進行用戶密碼的校驗。

2.2 權限驗證(受權)

也能夠說成受權,就是在身份認證後,驗證該身份具體擁有某種權限。即針對於某種資源的CRUD,不一樣用戶的操做權限是不一樣的。

通常簡單項目:作個sign(加密加鹽參數)+ 針對用戶的access_token

複雜的話,加入 SLL ,並使用OAuth2進行對token的安全傳輸。

天然,技術服務於應用場景。既簡單又能夠處理應用場景便可。 簡單,實用便可~

 

3、 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。

 

4、小結

1. REST API2. Spring Boot 攔截器 

歡迎點擊個人博客及GitHub — 博客提供RSS訂閱哦!———- http://www.bysocket.com/ ————-https://github.com/JeffLi1993 ———-

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

相關文章
相關標籤/搜索