午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Security 多過濾鏈的使用詳解

瀏覽:15日期:2023-07-03 09:40:59
目錄一、背景二、需求1、給客戶端使用的api2、給網(wǎng)站使用的api三、實現(xiàn)方案方案一:方案二四、實現(xiàn)1、app 端 Spring Security 的配置五、實現(xiàn)效果1、app 有權(quán)限訪問 api2、app 無權(quán)限訪問 api3、admin 用戶有權(quán)限訪問 網(wǎng)站 api4、dev 用戶無權(quán)限訪問 網(wǎng)站 api六、完整代碼一、背景

在我們實際的開發(fā)過程中,有些時候可能存在這么一些情況,某些api 比如: /api/** 這些是給App端使用的,數(shù)據(jù)的返回都是以JSON的格式返回,且這些API的認(rèn)證方式都是使用的TOKEN進(jìn)行認(rèn)證。而除了 /api/** 這些API之外,都是給網(wǎng)頁端使用的,需要使用表單認(rèn)證,給前端返回的都是某個頁面。

二、需求1、給客戶端使用的api 攔截 /api/**所有的請求。 /api/**的所有請求都需要ROLE_ADMIN的角色。 從請求頭中獲取 token,只要獲取到token的值,就認(rèn)為認(rèn)證成功,并賦予ROLE_ADMIN到角色。 如果沒有權(quán)限,則給前端返回JSON對象 {message:'您無權(quán)限訪問'} 訪問 /api/userInfo端點 請求頭攜帶 token 可以訪問。請求頭不攜帶token不可以訪問。2、給網(wǎng)站使用的api 攔截 所有的請求,但是不處理/api/**開頭的請求。 所有的請求需要ROLE_ADMIN的權(quán)限。 沒有權(quán)限,需要使用表單登錄。 登錄成功后,訪問了無權(quán)限的請求,直接跳轉(zhuǎn)到百度去。 構(gòu)建2個內(nèi)建的用戶 用戶一: admin/admin 擁有 ROLE_ADMIN 角色用戶二:dev/dev 擁有 ROLE_DEV 角色 訪問 /index 端點 admin 用戶訪問,可以訪問。dev 用戶訪問,不可以訪問,權(quán)限不夠。三、實現(xiàn)方案方案一:

直接拆成多個服務(wù),其中 /api/** 的成為一個服務(wù)。非/api/**的拆成另外一個服務(wù)。各個服務(wù)使用自己的配置,互不影響。

方案二

在同一個服務(wù)中編寫。不同的請求使用不同的SecurityFilterChain來實現(xiàn)。

經(jīng)過考慮,此處采用方案二來實現(xiàn),因為方案一簡單,使用方案二實現(xiàn),也可以記錄下在同一個項目中 通過使用多條過濾器鏈,因為并不是所有的時候,都是可以分成多個項目的。

擴(kuò)展:

1、Spring Security SecurityFilterChain 的結(jié)構(gòu)

Spring Security 多過濾鏈的使用詳解

2、控制 SecurityFilterChain 的執(zhí)行順序

使用 org.springframework.core.annotation.Order 注解。

3、查看是怎樣選擇那個 SecurityFilterChain 的

查看 org.springframework.web.filter.DelegatingFilterProxy#doFilter方法

四、實現(xiàn)1、app 端 Spring Security 的配置

package com.huan.study.security.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.security.authentication.TestingAuthenticationToken;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.core.Authentication;import org.springframework.security.core.authority.AuthorityUtils;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.security.web.SecurityFilterChain;import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;import java.nio.charset.StandardCharsets;/** * 給 app 端用的 Security 配置 * * @author huan.fu 2021/7/13 - 下午9:06 */@Configurationpublic class AppSecurityConfig { /** * 處理 給 app(前后端分離) 端使用的過濾鏈 * 以 json 的數(shù)據(jù)格式返回給前端 */ @Bean @Order(1) public SecurityFilterChain appSecurityFilterChain(HttpSecurity http) throws Exception {// 只處理 /api 開頭的請求return http.antMatcher('/api/**').authorizeRequests()// 所有以 /api 開頭的請求都需要 ADMIN 的權(quán)限 .antMatchers('/api/**') .hasRole('ADMIN') .and()// 捕獲到異常,直接給前端返回 json 串.exceptionHandling() .authenticationEntryPoint((request, response, authException) -> {response.setStatus(HttpStatus.UNAUTHORIZED.value());response.setCharacterEncoding(StandardCharsets.UTF_8.name());response.setContentType(MediaType.APPLICATION_JSON.toString());response.getWriter().write('{'message:':'您無權(quán)訪問01'}'); }) .accessDeniedHandler((request, response, accessDeniedException) -> {response.setStatus(HttpStatus.UNAUTHORIZED.value());response.setCharacterEncoding(StandardCharsets.UTF_8.name());response.setContentType(MediaType.APPLICATION_JSON.toString());response.getWriter().write('{'message:':'您無權(quán)訪問02'}'); }) .and()// 用戶認(rèn)證.addFilterBefore((request, response, chain) -> { // 此處可以模擬從 token 中解析出用戶名、權(quán)限等 String token = ((HttpServletRequest) request).getHeader('token'); if (!StringUtils.hasText(token)) {chain.doFilter(request, response);return; } Authentication authentication = new TestingAuthenticationToken(token, null, AuthorityUtils.createAuthorityList('ROLE_ADMIN')); SecurityContextHolder.getContext().setAuthentication(authentication); chain.doFilter(request, response);}, UsernamePasswordAuthenticationFilter.class).build(); }}

2、網(wǎng)站端 Spring Secuirty 的配置

package com.huan.study.security.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.annotation.Order;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;import org.springframework.security.core.authority.AuthorityUtils;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.web.SecurityFilterChain;/** * 給 網(wǎng)站 應(yīng)用的安全配置 * * @author huan.fu 2021/7/14 - 上午9:09 */@Configurationpublic class WebSiteSecurityFilterChainConfig { /** * 處理 給 webSite(非前后端分離) 端使用的過濾鏈 * 以 頁面 的格式返回給前端 */ @Bean @Order(2) public SecurityFilterChain webSiteSecurityFilterChain(HttpSecurity http) throws Exception {AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);// 創(chuàng)建用戶authenticationManagerBuilder.inMemoryAuthentication().withUser('admin') .password(new BCryptPasswordEncoder().encode('admin')) .authorities(AuthorityUtils.commaSeparatedStringToAuthorityList('ROLE_ADMIN')) .and().withUser('dev') .password(new BCryptPasswordEncoder().encode('dev')) .authorities(AuthorityUtils.commaSeparatedStringToAuthorityList('ROLE_DEV')) .and().passwordEncoder(new BCryptPasswordEncoder());// 只處理 所有 開頭的請求return http.antMatcher('/**').authorizeRequests()// 所有請求都必須要認(rèn)證才可以訪問 .anyRequest() .hasRole('ADMIN') .and()// 禁用csrf.csrf() .disable()// 啟用表單登錄.formLogin() .permitAll() .and()// 捕獲成功認(rèn)證后無權(quán)限訪問異常,直接跳轉(zhuǎn)到 百度.exceptionHandling() .accessDeniedHandler((request, response, exception) -> {response.sendRedirect('http://www.baidu.com'); }) .and().build(); } /** * 忽略靜態(tài)資源 */ @Bean public WebSecurityCustomizer webSecurityCustomizer( ){return web -> web.ignoring().antMatchers('/**/js/**').antMatchers('/**/css/**'); }}

3、控制器寫法

/** * 資源控制器 * * @author huan.fu 2021/7/13 - 下午9:33 */@Controllerpublic class ResourceController { /** * 返回用戶信息 */ @GetMapping('/api/userInfo') @ResponseBody public Authentication showUserInfoApi() {return SecurityContextHolder.getContext().getAuthentication(); } @GetMapping('/index') public String index(Model model){model.addAttribute('username','張三');return 'index'; }}

4、引入jar包

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>五、實現(xiàn)效果1、app 有權(quán)限訪問 api

Spring Security 多過濾鏈的使用詳解

2、app 無權(quán)限訪問 api

Spring Security 多過濾鏈的使用詳解

3、admin 用戶有權(quán)限訪問 網(wǎng)站 api

Spring Security 多過濾鏈的使用詳解

4、dev 用戶無權(quán)限訪問 網(wǎng)站 api

Spring Security 多過濾鏈的使用詳解

訪問無權(quán)限的API直接跳轉(zhuǎn)到 百度 首頁。

六、完整代碼

https://gitee.com/huan1993/Spring-Security/tree/master/multi-security-filter-chain

到此這篇關(guān)于Spring Security 多過濾鏈的使用詳解的文章就介紹到這了,更多相關(guān)Spring Security 多過濾鏈 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 成人免费大片黄在线播放 | 日韩欧美高清 | 在线观看免费av片 | 日本色午夜 | 午夜视频免费在线观看 | 国产精品一区二区视频 | 欧美xxxx黑人xyx性爽 | 神马午夜久久 | 四虎影院永久地址 | 一级成人免费视频 | 激情在线网站 | 精品久久一 | 国产精品第四页 | 国产精品男女 | 日韩精品一区二区三区在线观看 | 久久精品99久久久久久 | 亚洲成av人影院 | 亚洲精品日韩丝袜精品 | 国产第6页 | 国产永久免费观看 | 久久久99国产精品免费 | 天天干天天摸天天操 | 国产又大又猛 | 成人免费看片'在线观看 | 操人视频在线观看 | 午夜影院免费观看 | 亚洲一区二区三区免费在线观看 | 国产精品一区二区免费视频 | 四虎成人网 | 久久久久在线视频 | 国产精品1234区 | 朝桐光x88av 在线看日韩 | 国产精品久久久免费看 | 三级在线观看视频 | 成人免费视频国产在线观看 | 国产毛片一级 | av成人亚洲 | 日韩成人在线免费观看 | 国产激情啪啪 | jizz日本在线播放 | 欧美日韩中文 |