Spring Boot,支持約定優(yōu)于配置,,讓開發(fā)人員盡快啟動并運行項目,。針對 Spring Boot 的學(xué)習(xí)和總結(jié)準(zhǔn)備寫系列文章,。
代碼共享在【springboot-learning-example】,spring boot 實踐學(xué)習(xí)案例,是 spring boot 初學(xué)者及核心技術(shù)鞏固的最佳實踐,。
文章安排如下:
- 《Spring Boot 之 RESRful API 權(quán)限控制》
- 《Spring Boot 之 HelloWorld 詳解》
- 《Springboot 整合 Mybatis 的完整 Web 案例》
- 《Springboot 實現(xiàn) Restful 服務(wù),基于 HTTP / JSON 傳輸》
- 《Springboot 集成 FreeMarker》
- 《Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例》
- 《Springboot 整合 Redis 實現(xiàn)緩存》
- 《Springboot 整合 Druid 數(shù)據(jù)連接池》
- 《Springboot 集成 Shiro 完成授權(quán)》
- 《Springboot 實現(xiàn) Mybatis 多數(shù)據(jù)源配置》
—————————————————————————————————————————
Spring Boot 之 RESRful API 權(quán)限控制
一,、為何用RESTful API
1.1 RESTful是什么,?
RESTful(Representational State Transfer)架構(gòu)風(fēng)格,是一個Web自身的架構(gòu)風(fēng)格,,底層主要基于HTTP協(xié)議(ps:提出者就是HTTP協(xié)議的作者),,是分布式應(yīng)用架構(gòu)的偉大實踐理論,。RESTful架構(gòu)是無狀態(tài)的,,表現(xiàn)為請求-響應(yīng)的形式,有別于基于Bower的SessionId不同,。
1.2理解REST有五點:
1.資源
2.資源的表述
3.狀態(tài)的轉(zhuǎn)移
4.統(tǒng)一接口
5.超文本驅(qū)動
需要理解詳情,,請點[傳送門]
1.3 什么是REST API?
基于RESTful架構(gòu)的一套互聯(lián)網(wǎng)分布式的API設(shè)計理論,。和上面資源,,狀態(tài)和統(tǒng)一接口有著密切的關(guān)系。
為啥分布式互聯(lián)網(wǎng)架構(gòu)很常見呢,?請看下面兩個模式
MVC模式:
REST API模式:
1.4 權(quán)限怎么控制,?
RESTful針對資源的方法定義分簡單和關(guān)聯(lián)復(fù)雜兩種。
基本方法定義:
GET /user # 獲取user列表
GET /user/3 # 查看序號為3的user
POST /user # 新建一個user
PUT /user/3 # 更新序號為3的user
DELETE /user/3 #刪除user 3
資源之間的關(guān)聯(lián)方法如下定義:
GET /admin/1/user/10 # 管理員1號,,查看序號為3的user信息
...
那么權(quán)限如何控制,?
二、權(quán)限控制
前面說到,,RESTful是無狀態(tài)的,,所以每次請求就需要對起進(jìn)行認(rèn)證和授權(quán)。
2.1 認(rèn)證
身份認(rèn)證,,即登錄驗證用戶是否擁有相應(yīng)的身份,。簡單的說就是一個Web頁面點擊登錄后,服務(wù)端進(jìn)行用戶密碼的校驗,。
2.2 權(quán)限驗證(授權(quán))
也可以說成授權(quán),,就是在身份認(rèn)證后,驗證該身份具體擁有某種權(quán)限。即針對于某種資源的CRUD,不同用戶的操作權(quán)限是不同的,。
一般簡單項目:做個sign(加密加鹽參數(shù))+ 針對用戶的access_token
復(fù)雜的話,,加入 SLL ,并使用OAuth2進(jìn)行對token的安全傳輸,。
自然,,技術(shù)服務(wù)于應(yīng)用場景。既簡單又可以處理應(yīng)用場景即可,。簡單,,實用即可~
三、Access Token權(quán)限解決
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
第二步:根據(jù)token獲取校驗對象信息(也可以加入過期時間校驗,,簡單)
第三步:通過校驗信息獲取用戶信息
3.2 配置攔截
/**
* MVC 設(shè)置
*
*/
@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都可以。自然簡單的當(dāng)然是db,。
四,、小結(jié)
1. REST API
2. Spring Boot 攔截器
原創(chuàng)出處:泥瓦匠BYSocket | 01001000-01001111-01001101-01000101 泥瓦匠BYSocket 希望轉(zhuǎn)載,保留摘要,,謝謝,!