欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringSecurity實現(xiàn)動態(tài)加載權限信息的方法

 更新時間:2022年01月05日 14:50:44   作者:MMM_Demon  
這篇文章主要介紹了SpringSecurity實現(xiàn)動態(tài)加載權限信息,本文給大家介紹的非常詳細,對大家的學習或工作具有一定需要的朋友可以參考下

①數(shù)據(jù)庫中資源與角色對應關系,以及角色和用戶對應關系如下圖所示:

 ②實現(xiàn)FilterInvocationSecurityMetadataSource類

(1)List<Menu> menus = menuService.getMenusWithRoles();這個是你自己的資源對應角色的查詢方法。

(2)重寫的support方法都返回true

@Configuration
public class MyFilterInvocation implements FilterInvocationSecurityMetadataSource {
 
    @Autowired
    private MenuService menuService;
 
    AntPathMatcher antPathMatcher = new AntPathMatcher();
 
    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
        String requestUrl = ((FilterInvocation) object).getRequestUrl();
        List<Menu> menus = menuService.getMenusWithRoles();
        //- 遍歷數(shù)據(jù)庫的url,看請求路徑是否與其匹配
        for (Menu menu : menus) {
            //- 如果請求路徑和數(shù)據(jù)庫的路徑匹配
            if (antPathMatcher.match(menu.getUrl(),requestUrl)){
                //- 訪問該路徑需要的角色
                List<Role> roles = menu.getRoles();
                String[] strs = new String[roles.size()];
                for (int i = 0; i < roles.size(); i++) {
                    strs[i] = roles.get(i).getName();
                }
                return SecurityConfig.createList(strs);
            }
        }
        //- 如果請求路徑和數(shù)據(jù)庫的所有路徑都不匹配,說明這個資源是登錄后即可訪問的
        //- 用戶登錄即可訪問,相當于在SecurityConfig中配置了.anyRequest().authenticated()
        return SecurityConfig.createList("ROLE_LOGIN");
    }
 
    @Override
    public Collection<ConfigAttribute> getAllConfigAttributes() {
        return null;
    }
 
    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
}

 

 

③實現(xiàn)AccessDecisionManager

重寫的support方法都返回true

@Configuration
public class MyDecisionManager implements AccessDecisionManager {
 
 
    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
        for (ConfigAttribute configAttribute : configAttributes) {
            String needRole = configAttribute.getAttribute();
            if ("ROLE_LOGIN".equals(needRole)) {
                //- 用戶登錄即可訪問,相當于在SecurityConfig中配置了.anyRequest().authenticated()
                if (authentication instanceof AnonymousAuthenticationToken) {
                    throw new AccessDeniedException("尚未登錄,請先登錄");
                } else {
                    return;
                }
            }
            
            Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
            //這里我寫的是只要訪問該資源的用戶具有`訪問該資源所需要角色`的其中一個即可
            for (GrantedAuthority authority : authorities) {
                if (authority.getAuthority().equals(needRole)) {
                    return;
                }
            }
        }
        throw new AccessDeniedException("權限不足,請聯(lián)系管理員");
    }
 
    @Override
    public boolean supports(ConfigAttribute attribute) {
        return true;
    }
 
    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
}

④到SecurityConfig配置類中完成相應配置

    @Autowired
    private MyDecisionManager myDecisionManager;
    
    @Autowired
    private  MyFilterInvocation myFilterInvocation;
 
     @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                    @Override
                    public <O extends FilterSecurityInterceptor> O postProcess(O object) {
                        object.setAccessDecisionManager(myDecisionManager);
                        object.setSecurityMetadataSource(myFilterInvocation);
                        return object;
                    }
                });
 
            http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler());
 
    }
 
 
    @Bean
    MyAccessDeniedHandler myAccessDeniedHandler(){
        return new MyAccessDeniedHandler();
    }

⑤可選,實現(xiàn)AccessDeniedHandler

public class MyAccessDenied implements AccessDeniedHandler {
 
    @Override
    public void handle(HttpServletRequest req, HttpServletResponse resp, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        resp.setContentType("application/json;charset=utf-8");
        PrintWriter pw = resp.getWriter();
        pw.write(new ObjectMapper().writeValueAsString(RespBean.error("權限不夠,請聯(lián)系管理員")));
        pw.flush();
        pw.close();
    }
}

到此這篇關于SpringSecurity實現(xiàn)動態(tài)加載權限信息的文章就介紹到這了,更多相關SpringSecurity動態(tài)加載權限內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在Java的MyBatis框架中建立接口進行CRUD操作的方法

    在Java的MyBatis框架中建立接口進行CRUD操作的方法

    這篇文章主要介紹了在Java的MyBatis框架中建立接口進行CRUD操作的方法,CRUD是指在做計算處理時的增加(Create)、重新取得數(shù)據(jù)(Retrieve)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫,需要的朋友可以參考下
    2016-04-04
  • java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類)

    java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類)

    這篇文章主要介紹了java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Java Lambda 表達式詳解及示例代碼

    Java Lambda 表達式詳解及示例代碼

    本文主要介紹Java Lambda 表達式的知識,這里整理了相關資料,JavaLambda 是Java8 引入的新功能,有興趣的小伙伴可以參考下
    2016-09-09
  • Data Source與數(shù)據(jù)庫連接池簡介(JDBC簡介)

    Data Source與數(shù)據(jù)庫連接池簡介(JDBC簡介)

    DataSource是作為DriverManager的替代品而推出的,DataSource 對象是獲取連接的首選方法,這篇文章主要介紹了Data Source與數(shù)據(jù)庫連接池簡介(JDBC簡介),需要的朋友可以參考下
    2022-11-11
  • 剖析Fork?join并發(fā)框架工作竊取算法

    剖析Fork?join并發(fā)框架工作竊取算法

    這篇文章主要為大家剖析介紹了Fork?join并發(fā)框架工作竊取算法的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Java求質(zhì)數(shù)的幾種常用算法分析

    Java求質(zhì)數(shù)的幾種常用算法分析

    這篇文章主要介紹了Java求質(zhì)數(shù)的幾種常用算法,結(jié)合實例形式分析了三種比較常見的求質(zhì)數(shù)算法原理及相關實現(xiàn)技巧,需要的朋友可以參考下
    2018-12-12
  • [Spring MVC]-詳解SpringMVC的各種參數(shù)綁定方式

    [Spring MVC]-詳解SpringMVC的各種參數(shù)綁定方式

    本篇文章主要介紹了SpringMVC的各種參數(shù)綁定方式 ,具有一定的參考價值,有需要的可以了解一下。
    2016-12-12
  • 實例分析Java單線程與多線程

    實例分析Java單線程與多線程

    本篇文章通過代碼實例給大家詳細講述了Java單線程與多線程的相關原理和知識點總結(jié),需要的朋友可以學習下。
    2018-02-02
  • mybatis insert返回主鍵代碼實例

    mybatis insert返回主鍵代碼實例

    這篇文章主要介紹了mybatis insert返回主鍵代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作

    MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作

    Mybatis-Plus是一個?Mybatis?的增強工具,在?Mybatis?的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關于MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作的相關資料,需要的朋友可以參考下
    2022-03-03

最新評論