真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringSecurityOAuth2如何實(shí)現(xiàn)根據(jù)請(qǐng)求URI動(dòng)態(tài)權(quán)限判斷

這篇文章主要講解了“SpringSecurityOAuth2如何實(shí)現(xiàn)根據(jù)請(qǐng)求URI動(dòng)態(tài)權(quán)限判斷”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“SpringSecurityOAuth2如何實(shí)現(xiàn)根據(jù)請(qǐng)求URI動(dòng)態(tài)權(quán)限判斷”吧!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、麻城網(wǎng)站維護(hù)、網(wǎng)站推廣。

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

新建一個(gè)資源項(xiàng)目,配置資源服務(wù)。 首先 自定義一個(gè)權(quán)限認(rèn)證MySecurityAccessDecisionManager 繼承AccessDecisionManager接口,重寫 decide方法, 并且復(fù)制默認(rèn)權(quán)限驗(yàn)證AbstractAccessDecisionManager的剩余兩個(gè)方法(實(shí)現(xiàn)注解控制的重點(diǎn))。用戶具有的權(quán)限在認(rèn)證服務(wù)器中已經(jīng)自定義了。

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

    private List> decisionVoters;

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

        // 當(dāng)前用戶所具有的權(quán)限
        Collection 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("無訪問權(quán)限");
    }

    /**
     * 復(fù)制默認(rèn)方法,使得@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;
    }
}

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

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

    @Autowired
    private redisConnectionFactory connectionFactory;

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

    @Resource
    private MyAccessDeniedHandler accessDeniedHandler; // 無權(quán)訪問處理器

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

    @Resource
    private MySecurityAccessDecisionManager accessDecisionManager; //權(quán)限判斷

    @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) // 另外,如果不設(shè)置,那么在通過瀏覽器訪問被保護(hù)的任何資源時(shí),每次是不同的SessionID,并且將每次請(qǐng)求的歷史都記錄在OAuth3Authentication的details的中
                .and()
                .authorizeRequests().antMatchers("/actuator/health").permitAll().anyRequest().authenticated()  // httpSecurity 放過健康檢查,其他都需要驗(yàn)證  設(shè)置了.anyRequest().authenticated()才回進(jìn)入自定義的權(quán)限判斷
                .and()
                .requestMatchers().antMatchers("/auth/**") // .requestMatchers().antMatchers(...) OAuth3設(shè)置對(duì)資源的保護(hù)如果是用 /**的話 會(huì)把上面的也攔截掉
                .and()
                .authorizeRequests()
                .withObjectPostProcessor(new ObjectPostProcessor() {       // 重寫做權(quán)限判斷
                    @Override
                    public  O postProcess(O o) {
                        o.setAccessDecisionManager(accessDecisionManager);      // 權(quán)限判斷
                        return o;
                    }
                })
                .and()
                .httpBasic();

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

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

在MySecurityAccessDecisionManager打斷點(diǎn)可以發(fā)現(xiàn),全部請(qǐng)求都走這里進(jìn)行權(quán)限判斷了,根據(jù)認(rèn)證服務(wù)器中的權(quán)限組合,匹配uri的請(qǐng)求進(jìn)行結(jié)合方法上的注解權(quán)限進(jìn)行是否有權(quán)訪問判斷,原則是全過則過,否則無權(quán)。

感謝各位的閱讀,以上就是“SpringSecurityOAuth2如何實(shí)現(xiàn)根據(jù)請(qǐng)求URI動(dòng)態(tài)權(quán)限判斷”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)SpringSecurityOAuth2如何實(shí)現(xiàn)根據(jù)請(qǐng)求URI動(dòng)態(tài)權(quán)限判斷這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


分享名稱:SpringSecurityOAuth2如何實(shí)現(xiàn)根據(jù)請(qǐng)求URI動(dòng)態(tài)權(quán)限判斷
本文鏈接:http://weahome.cn/article/iphido.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部