天天看點

Spring Boot 之 RESRful API 權限控制一、為何用RESTful API二、權限控制三、Access Token權限解決四、小結

“簡單,踏實~ 讀書寫字放屁”

restful(representational state transfer)架構風格,是一個web自身的架構風格,底層主要基于http協定(ps:提出者就是http協定的作者),是分布式應用架構的偉大實踐理論。restful架構是無狀态的,表現為請求-響應的形式,有别于基于bower的sessionid不同。

<b> </b>

1.資源 

2.資源的表述 

3.狀态的轉移 

4.統一接口 

5.超文本驅動

基于restful架構的一套網際網路分布式的api設計理論。和上面資源,狀态和統一接口有着密切的關系。

為啥分布式網際網路架構很常見呢?請看下面兩個模式

<b>mvc模式</b>:

Spring Boot 之 RESRful API 權限控制一、為何用RESTful API二、權限控制三、Access Token權限解決四、小結

<b>rest api模式</b>:

Spring Boot 之 RESRful API 權限控制一、為何用RESTful API二、權限控制三、Access Token權限解決四、小結

restful針對資源的方法定義分簡單和關聯複雜兩種。

基本方法定義:

1

2

3

4

5

<code>get /user # 擷取user清單</code>

<code>get /user/</code><code>3</code> <code># 檢視序号為</code><code>3</code><code>的user</code>

<code>post /user # 建立一個user</code>

<code>put /user/</code><code>3</code>  <code># 更新序号為</code><code>3</code><code>的user</code>

<code>delete /user/</code><code>3</code> <code>#删除user</code><code>3</code>

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

<code>get /admin/</code><code>1</code><code>/user/</code><code>10</code> <code># 管理者</code><code>1</code><code>号,檢視序号為</code><code>3</code><code>的user資訊</code>

<code>...</code>

那麼權限如何控制?

前面說到,restful是無狀态的,是以每次請求就需要對起進行認證和授權。

身份認證,即登入驗證使用者是否擁有相應的身份。簡單的說就是一個web頁面點選登入後,服務端進行使用者密碼的校驗。

也可以說成授權,就是在身份認證後,驗證該身份具體擁有某種權限。即針對于某種資源的crud,不同使用者的操作權限是不同的。

一般簡單項目:做個sign(加密加鹽參數)+ 針對使用者的access_token

複雜的話,加入 sll ,并使用oauth2進行對token的安全傳輸。

自然,技術服務于應用場景。既簡單又可以處理應用場景即可。簡單,實用即可~

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

<code>/**</code>

<code> </code><code>* access token攔截器</code>

<code> </code><code>* &lt;p/&gt;</code>

<code> </code><code>* created by bysocket on 16/4/18.</code>

<code> </code><code>*/</code>

<code>@component</code>

<code>public</code> <code>class</code> <code>accesstokenverifyinterceptor</code><code>extends</code> <code>handlerinterceptoradapter {</code>

<code>    </code><code>@autowired</code>

<code>    </code><code>validationservice validationservice;</code>

<code>    </code><code>private</code> <code>final</code> <code>static</code> <code>logger log = loggerfactory.getlogger(accesstokenverifyinterceptor.</code><code>class</code><code>);</code>

<code>    </code><code>@override</code>

<code>    </code><code>public</code> <code>boolean</code> <code>prehandle(httpservletrequest request, httpservletresponse response, object handler)</code>

<code>            </code><code>throws</code> <code>exception {</code>

<code>        </code><code>log.info(</code><code>"accesstoken executing ..."</code><code>);</code>

<code>        </code><code>boolean</code> <code>flag =</code><code>false</code><code>;</code>

<code>        </code><code>// token</code>

<code>        </code><code>string accesstoken = request.getparameter(</code><code>"token"</code><code>);</code>

<code>        </code><code>if</code> <code>(stringutils.isnotblank(accesstoken)) {</code>

<code>            </code><code>// 驗證</code>

<code>            </code><code>validationmodel v = validationservice.verifyaccesstoken(accesstoken);</code>

<code>            </code><code>// 時間過期</code>

<code>            </code><code>// 使用者驗證</code>

<code>            </code><code>if</code> <code>(v !=</code><code>null</code><code>) {</code>

<code>                </code><code>user user = userservice.findbyid(v.getuid());</code>

<code>                </code><code>if</code><code>(user !=</code><code>null</code><code>) {</code>

<code>                    </code><code>request.setattribute(commonconst.param_user, user);</code>

<code>                    </code><code>log.info(</code><code>"accesstoken success ...  user:"</code> <code>+ user.getusername() +</code><code>" - "</code> <code>+ accesstoken);</code>

<code>                    </code><code>flag =</code><code>true</code><code>;</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>        </code><code>if</code> <code>(!flag) {</code>

<code>            </code><code>response.setstatus(httpstatus.forbidden.value());</code>

<code>            </code><code>response.getwriter().print(</code><code>"accesstoken error"</code><code>);</code>

<code>        </code><code>return</code> <code>flag;</code>

<code>    </code><code>}</code>

<code>}</code>

第一步:從request擷取token

第二步:根據token擷取校驗對象資訊(也可以加入過期時間校驗,簡單)

第三步:通過校驗資訊擷取使用者資訊

<code> </code><code>* mvc 設定</code>

<code> </code><code>*</code>

<code>@configuration</code>

<code>public</code> <code>class</code> <code>webmvcconfig</code><code>extends</code> <code>webmvcconfigureradapter {</code>

<code>    </code><code>@bean</code>

<code>    </code><code>public</code> <code>accesstokenverifyinterceptor tokenverifyinterceptor() {</code>

<code>        </code><code>return</code> <code>new</code> <code>accesstokenverifyinterceptor();</code>

<code>    </code><code>public</code> <code>void</code> <code>addinterceptors(interceptorregistry registry) {</code>

<code>        </code><code>registry.addinterceptor(tokenverifyinterceptor()).addpathpatterns(</code><code>"/test"</code><code>);</code>

<code>        </code><code>super</code><code>.addinterceptors(registry);</code>

第一步:将攔截器配置成bean

第二步:攔截器注冊注入該攔截器,并配置攔截的url

<b>token存哪裡?</b>

ehcache,redis,db都可以。自然簡單的當然是db。

1. rest api

2. spring boot 攔截器