統一認證系統實現要點-資源認證

權限系統有一個普遍的需求,即:用戶登錄系統後,在瀏覽器地址欄直接輸入未經授權的URL,應該拒絕其訪問。
目前有很多線程的權限框架對這部分進行了封裝,如shiro,但是如果不想引入新框架,保持系統的輕量,該如何做呢?

對於普通Spring MVC項目來說,每個@RequestMapping標註的方法應該就對應了一個操作行爲。
如何配置用戶權限信息讓用戶在到達每個操作行爲前就判斷用戶是否有進行當前操作的權限就是需要解決的問題。 
最終目的是保持唯一性,以及訪問URL的時候,能獲取當前訪問的資源的權限代碼是什麼,從而驗證權限。

方式一
最開始是給每個資源定義了一個權限代碼,該權限代碼在應用中保持唯一,採用約定優於配置的方式,該權限代碼即URL中除去IP,端口,上下文,餘下的部分。給角色分配資源的時候,自然就等於分配了這些權限代碼。訪問的時候,通過URL拿到權限代碼,驗證是否有權限即可。權限代碼的組成多種多樣,根據系統需要,也可以將url+method作爲權限代碼。

方式二
我們的url,method,甚至是parameter和header定義都可以寫到@RequestMapping註解內,我們有必要到數據庫重複一遍嗎? 
url包含通配符或者PathVariable的時候,哪怕使用AntPathMatcher也可能出現一條url映射出多個urlPattern的情況,選擇最優匹配能不能和Spring的結果一致?而Spring MVC總是能爲我們的請求找到對應的方法,我們能不能交給Spring去做好這件事? 

答案是可以,使用攔截器,HandlerInterceptorAdapter的preHandle方法的handler參數中(需要強制轉換爲HandlerMethod對象),已經包含了Spring爲我們查找到的method對象。 method對象是可以獲得所有註解的,我們可以自己實現一個註解類來標識每一個RequestMapping,也就是賦予ID,然後在數據庫中將這些ID和角色進行關聯,只需要在preHandle方法中取得這個id,然後驗證當前用戶是否具有這個id就能夠判斷用戶是否具有權限,並依此決定是否放行! 
現在的問題就轉換爲如何同步數據庫和應用程序中的這些ID,Spring已經爲我們提供了一個解決方案,就是BeanPostProcessor接口。 在Spring實例化每個controller的時候進行介入讀取所有的ID並緩存,在系統完全啓動後觸發ApplicationListener中的ContextRefreshEvent事件,這時我們可以和數據庫中的id進行比對,刪除已經不存在的關聯,並提醒管理員關聯新增的operation id。 

相比之下方式二更加優雅。



發佈了311 篇原創文章 · 獲贊 2448 · 訪問量 257萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章