您好,登錄后才能下訂單哦!
本篇內容主要講解“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動態權限判斷”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。