Spring boot 那些事之RESRful API 許可權控制
Spring boot 那些事之RESRful API 許可權控制
生活者
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 希望轉載,保留摘要,謝謝!