SpringBoot整合SpringSecurityOauth2實現(xiàn)鑒權-動態(tài)權限
寫在前面
思考:為什么需要鑒權呢?
系統(tǒng)開發(fā)好上線后,API接口會暴露在互聯(lián)網上會存在一定的安全風險,例如
:爬蟲、惡意訪問等。因此,我們需要對非開放API接口進行用戶鑒權 ,鑒權通過之后再允許調用
。
準備
spring-boot:2.1.4.RELEASE
spring-security-oauth2:2.3.3.RELEASE(如果要使用源碼,不要隨意改動這個版本號,因為2.4往上的寫法不一樣了)
mysql
:5.7
效果展示
這邊只用了postman做測試
,暫時未使用前端頁面來對接,下個版本角色菜單權限分配的會有頁面的展示
1、訪問開放接口 http://localhost:7000/open/hello

2
、不帶token訪問受保護接口 http://localhost:7000/admin/user/info

3 、登錄后獲取token
,帶上token訪問,成功返回了當前的登錄用戶信息


實現(xiàn)
oauth2一共有四種模式,這邊就不做講解了 ,網上搜一搜,千篇一律
因為現(xiàn)在只考慮做單方應用的,所以使用的是密碼模式 。
后面會出一篇SpringCloud+Oauth2的文章,網關鑒權
講一下幾個點吧
1、攔截器配置動態(tài)權限

新建一個 MySecurityFilter類 ,繼承AbstractSecurityInterceptor ,并實現(xiàn)Filter接口
初始化
,自定義訪問決策管理器
@PostConstruct public void init(){ super.setAuthenticationManager(authenticationManager); super.setAccessDecisionManager(myAccessDecisionManager); }
自定義 過濾器調用安全元數據源
@Overridepublic SecurityMetadataSource obtainSecurityMetadataSource() { return this.mySecurityMetadataSource;}
先來看一下自定義過濾器調用安全元數據源的核心代碼
以下代碼是用來獲取到當前請求進來所需要的權限(角色)

/** * 獲得當前請求所需要的角色 * @param object * @return * @throws IllegalArgumentException */ @Override public CollectiongetAttributes(Object object) throws IllegalArgumentException { String requestUrl = ((FilterInvocation) object).getRequestUrl(); if (IS_CHANGE_SECURITY) { loadResourceDefine(); } if (requestUrl.indexOf("?") >-1) { requestUrl = requestUrl.substring(0, requestUrl.indexOf("?")); } UrlPathMatcher matcher = new UrlPathMatcher(); List