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

溫馨提示×

溫馨提示×

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

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

SpringSecurityOAuth2如何實現根據請求URI動態權限判斷

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

這篇文章主要講解了“SpringSecurityOAuth2如何實現根據請求URI動態權限判斷”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringSecurityOAuth2如何實現根據請求URI動態權限判斷”吧!

一般我們通過@PreAuthorize("hasRole('ROLE_USER')") 注解,以及在HttpSecurity配置權限需求等來控制權限。在這里,我們基于請求的URI來控制訪問權限,并且可以使用注解來控制權限訪問。

新建一個資源項目,配置資源服務。 首先 自定義一個權限認證MySecurityAccessDecisionManager 繼承AccessDecisionManager接口,重寫 decide方法, 并且復制默認權限驗證AbstractAccessDecisionManager的剩余兩個方法(實現注解控制的重點)。用戶具有的權限在認證服務器中已經自定義了。

/**
 * @Description 自定義權限認證,獲取url判斷是否有權限
 * @Author wwz
 * @Date 2019/08/01
 * @Param
 * @Return
 */
@Component
public class MySecurityAccessDecisionManager implements AccessDecisionManager {

    private List<AccessDecisionVoter<? extends Object>> decisionVoters;

    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
        String requestUrl = ((FilterInvocation) object).getRequest().getMethod() + ((FilterInvocation) object).getRequest().getRequestURI();
//        System.out.println("requestUrl>>" + requestUrl);

        // 當前用戶所具有的權限
        Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
//        System.out.println("authorities=" + authorities);
        for (GrantedAuthority grantedAuthority : authorities) {
            if (grantedAuthority.getAuthority().equals(requestUrl)) {
                return;
            }
            if (grantedAuthority.getAuthority().equals("ROLE_ADMIN")) {
                return;
            }

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

    /**
     * 復制默認方法,使得@PreAuthorize("hasRole('ROLE_ADMIN')") 可用
     */
    @Override
    public boolean supports(ConfigAttribute attribute) {
        for (AccessDecisionVoter voter : this.decisionVoters) {
            if (voter.supports(attribute)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        for (AccessDecisionVoter voter : this.decisionVoters) {
            if (!voter.supports(clazz)) {
                return false;
            }
        }
        return true;
    }
}

在資源服務配置的httpSecurity中重寫并注入:

/**
 * @Description 資源認證
 * @Author wwz
 * @Date 2019/08/01
 * @Param
 * @Return
 */
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)   // 啟用注解權限配置
public class MySecurityResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Autowired
    private RedisConnectionFactory connectionFactory;

    @Bean
    public TokenStore tokenStore() {
        RedisTokenStore redis = new RedisTokenStore(connectionFactory);
        return redis;
    }

    @Resource
    private MyAccessDeniedHandler accessDeniedHandler; // 無權訪問處理器

    @Resource
    private MyTokenExceptionEntryPoint tokenExceptionEntryPoint; // token失效處理器

    @Resource
    private MySecurityAccessDecisionManager accessDecisionManager; //權限判斷

    @Override
    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.setAccessDecisionManager(accessDecisionManager);      // 權限判斷
                        return o;
                    }
                })
                .and()
                .httpBasic();

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

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.authenticationEntryPoint(tokenExceptionEntryPoint); // token失效處理器
        resources.resourceId("manager"); // 設置資源id  通過client的 resource_ids 來判斷是否具有資源權限  資源不存在會報Invalid token does not contain resource id (manager)
    }
}

在MySecurityAccessDecisionManager打斷點可以發現,全部請求都走這里進行權限判斷了,根據認證服務器中的權限組合,匹配uri的請求進行結合方法上的注解權限進行是否有權訪問判斷,原則是全過則過,否則無權。

感謝各位的閱讀,以上就是“SpringSecurityOAuth2如何實現根據請求URI動態權限判斷”的內容了,經過本文的學習后,相信大家對SpringSecurityOAuth2如何實現根據請求URI動態權限判斷這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

广德县| 晋中市| 永嘉县| 华阴市| 广西| 邢台县| 莎车县| 吐鲁番市| 康乐县| 称多县| 来凤县| 安福县| 万山特区| 蒙城县| 亚东县| 湖口县| 崇信县| 土默特右旗| 枝江市| 台湾省| 阿尔山市| 桂阳县| 衡阳市| 德昌县| 西盟| 鄂伦春自治旗| 台山市| 洪雅县| 惠水县| 柳州市| 尤溪县| 岳西县| 乌拉特前旗| 江门市| 同仁县| 法库县| 沙雅县| 霞浦县| 西乌| 大渡口区| 陆川县|