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

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、麻城網(wǎng)站維護、網(wǎng)站推廣。
一般我們通過@PreAuthorize("hasRole('ROLE_USER')") 注解,以及在HttpSecurity配置權(quán)限需求等來控制權(quán)限。在這里,我們基于請求的URI來控制訪問權(quán)限,并且可以使用注解來控制權(quán)限訪問。
新建一個資源項目,配置資源服務(wù)。 首先 自定義一個權(quán)限認證MySecurityAccessDecisionManager 繼承AccessDecisionManager接口,重寫 decide方法, 并且復(fù)制默認權(quán)限驗證AbstractAccessDecisionManager的剩余兩個方法(實現(xiàn)注解控制的重點)。用戶具有的權(quán)限在認證服務(wù)器中已經(jīng)自定義了。
/**
* @Description 自定義權(quán)限認證,獲取url判斷是否有權(quán)限
* @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);
// 當前用戶所具有的權(quán)限
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("無訪問權(quán)限");
}
/**
* 復(fù)制默認方法,使得@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 資源認證
* @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è)置,那么在通過瀏覽器訪問被保護的任何資源時,每次是不同的SessionID,并且將每次請求的歷史都記錄在OAuth3Authentication的details的中
.and()
.authorizeRequests().antMatchers("/actuator/health").permitAll().anyRequest().authenticated() // httpSecurity 放過健康檢查,其他都需要驗證 設(shè)置了.anyRequest().authenticated()才回進入自定義的權(quán)限判斷
.and()
.requestMatchers().antMatchers("/auth/**") // .requestMatchers().antMatchers(...) OAuth3設(shè)置對資源的保護如果是用 /**的話 會把上面的也攔截掉
.and()
.authorizeRequests()
.withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() { // 重寫做權(quán)限判斷
@Override
public <O extends FilterSecurityInterceptor> 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)限 資源不存在會報Invalid token does not contain resource id (manager)
}
}在MySecurityAccessDecisionManager打斷點可以發(fā)現(xiàn),全部請求都走這里進行權(quán)限判斷了,根據(jù)認證服務(wù)器中的權(quán)限組合,匹配uri的請求進行結(jié)合方法上的注解權(quán)限進行是否有權(quán)訪問判斷,原則是全過則過,否則無權(quán)。
感謝各位的閱讀,以上就是“SpringSecurityOAuth2如何實現(xiàn)根據(jù)請求URI動態(tài)權(quán)限判斷”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對SpringSecurityOAuth2如何實現(xiàn)根據(jù)請求URI動態(tài)權(quán)限判斷這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)頁名稱:SpringSecurityOAuth2如何實現(xiàn)根據(jù)請求URI動態(tài)權(quán)限判斷
鏈接URL:http://www.chinadenli.net/article10/iphido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、標簽優(yōu)化、品牌網(wǎng)站制作、微信公眾號、建站公司、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)