[原創]SpringSecurity控制授權(鑑權)功能介紹

1.spring security 過濾器鏈

​ spring security中的除了用戶登錄校驗相關的過濾器,最後還包含了鑑權功能的過濾器,還有匿名資源訪問的過濾器鏈,相關的圖解如下:

2.控制授權的相關類

​ 這裏是整個spring security的過濾器鏈中的授權流程中控制權限的類的相關圖示:

​ 這裏主要是從AccessDecisionVoter的投票者(譯稱)把信息傳遞給投票管理者AccessDecisionManager,最終來判斷是過還是不過(也就是有沒有權限).有兩種可能的類:

​ 1.不管有多少請求投票不過,只要有一個過就可以通過(UnanimousBased);

​ 2.不管有多少請求投票通過,只要有一個不通過就不讓通過(AffirmativeBased);

​ 3.比較投通過和不通過的個數,誰多久就按照誰的方式來(Consensusbased).

​ 這裏可以可能聽起來有點繞,但實際上就是三種控制權限的方式類,我們可以認爲Spring security已經幫我們做好了最終的判斷,我們只需要當一個旁觀者即可.

​ 我們再來關注SecurityContextHolder這個類,他會將我們的權限信息封裝到Authentication中,SecurityConfig則是相關的Spring security的配置信息,這個類會將相關的信息傳遞到ConfigAttribute中.

3.配置簡單的權限

​ 這個在身份信息固定,並且不會經常變動的情況下可以按照如下配置,否則不建議這麼做,這裏只適用於簡單的場景.

MyUserDetailsService:

private SocialUserDetails buildUser(String userId) {
        // 根據用戶名查找用戶信息
        //根據查找到的用戶信息判斷用戶是否被凍結
        /**
         * 可以從數據庫查出來用戶名和密碼進行比對,爲了方便我這裏就直接固定了
         */
        String password = passwordEncoder.encode("123456");
        logger.info("數據庫密碼是:"+password);
        //注意這裏配置角色的時候需要加ROLE_前綴
        return new SocialUser(userId, password,
                true, true, true, true,
                AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));
    }

BrowserSecurityConfig:

//這裏是硬編碼權限 只限於簡單的用戶權限 這裏的角色名稱嚴格區分大小寫
   //這裏可以指定HttpMethod  如HttpMethod.GET,
    .antMatchers("/user/**").hasRole("ADMIN")
        .anyRequest()     //所有請求
        .authenticated() //都需身份認證

4.項目git地址

(喜歡記得點星支持哦,謝謝!)

https://github.com/fengcharly/spring-security-oauth2.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章