91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Security OAuth2中怎么根據請求URI動態權限判斷

發布時間:2021-11-17 10:04:47 來源:億速云 閱讀:236 作者:iii 欄目:大數據

本篇內容主要講解“Spring Security OAuth2中怎么根據請求URI動態權限判斷”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring Security OAuth2中怎么根據請求URI動態權限判斷”吧!

優化內容:先增加一級獲取uri然后判斷uri需要什么權限,可以多個并且的權限 等等然后 在經過權限判斷器進行攔截判斷

新建自定義的url權限判斷MyFilterInvocationSecurityMetadataSource 實現FilterInvocationSecurityMetadataSource

/**
 * @Description 根據url獲取 url需要訪問的權限
 * @Author wwz
 * @Date 2019/08/01
 * @Param
 * @Return
 */
@Component
public class MyFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {

    private AntPathMatcher antPathMatcher = new AntPathMatcher(); // 模糊匹配 如何 auth/**   auth/auth

    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
        Set<ConfigAttribute> set = new HashSet<>();

        String requestUrl = ((FilterInvocation) object).getRequest().getMethod() + ((FilterInvocation) object).getRequest().getRequestURI();
        System.out.println("requestUrl >> " + requestUrl);

        // 這里獲取對比數據可以從數據庫或者內存 redis等等地方獲取 目前先寫死后面優化
        String url = "GET/auth/**";
        if (antPathMatcher.match(url, requestUrl)) {
            SecurityConfig securityConfig = new SecurityConfig("ROLE_ADMIN");
            set.add(securityConfig);
        }
        if (ObjectUtils.isEmpty(set)) {
            return SecurityConfig.createList("ROLE_LOGIN");
        }
        return set;
    }

    @Override
    public Collection<ConfigAttribute> getAllConfigAttributes() {
        return null;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return FilterInvocation.class.isAssignableFrom(clazz);
    }
}

修改原來MySecurityAccessDecisionManager 的decide,從獲取到url 改成獲取到需要什么權限。其他判斷不變

    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {

        System.out.println("collection>>" + configAttributes);

        for (ConfigAttribute configAttribute : configAttributes) {
            // 當前請求需要的權限
            String needRole = configAttribute.getAttribute();
            // 當前用戶所具有的權限
            Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
            System.out.println("authorities=" + authorities);
            for (GrantedAuthority grantedAuthority : authorities) {
                if (grantedAuthority.getAuthority().equals(needRole)) {
                    return;
                }
                if (grantedAuthority.getAuthority().equals("ROLE_ADMIN")) {
                    return;
                }

            }
        }
        throw new AccessDeniedException("無訪問權限");
    }

把MyFilterInvocationSecurityMetadataSource 注冊到MySecurityResourceServerConfig的重寫方法

 public void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .exceptionHandling().authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 另外,如果不設置,那么在通過瀏覽器訪問被保護的任何資源時,每次是不同的SessionID,并且將每次請求的歷史都記錄在OAuth3Authentication的details的中
                .and()
                .authorizeRequests().antMatchers("/actuator/health").permitAll().anyRequest().authenticated()  // httpSecurity 放過健康檢查,其他都需要驗證  設置了.anyRequest().authenticated()才回進入自定義的權限判斷
                .and()
                .requestMatchers().antMatchers("/auth/**") // .requestMatchers().antMatchers(...) OAuth3設置對資源的保護如果是用 /**的話 會把上面的也攔截掉
                .and()
                .authorizeRequests()
                .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {       // 重寫做權限判斷
                    @Override
                    public <O extends FilterSecurityInterceptor> O postProcess(O o) {
                        o.setSecurityMetadataSource(filterInvocationSecurityMetadataSource); // 請求需要權限
                        o.setAccessDecisionManager(accessDecisionManager);      // 權限判斷
                        return o;
                    }
                })
                .and()
                .httpBasic();

        http.exceptionHandling().accessDeniedHandler(accessDeniedHandler);
    }

嘗試并請求打印信息:

Spring Security OAuth2中怎么根據請求URI動態權限判斷

Spring Security OAuth2中怎么根據請求URI動態權限判斷

到此,相信大家對“Spring Security OAuth2中怎么根據請求URI動態權限判斷”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霸州市| 修水县| 永昌县| 隆安县| 广州市| 长沙县| 政和县| 镶黄旗| 芒康县| 兴国县| 扎鲁特旗| 太原市| 乌鲁木齐市| 文成县| 石河子市| 板桥市| 芜湖县| 翁牛特旗| 资源县| 龙里县| 芮城县| 竹山县| 浦县| 阿荣旗| 南城县| 安陆市| 枣庄市| 余干县| 顺平县| 盈江县| 石城县| 和田市| 定安县| 拜泉县| 德钦县| 珠海市| 陇南市| 南康市| 石阡县| 青铜峡市| 台东县|