日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Boot構建系統安全層的步驟

瀏覽:28日期:2023-07-16 17:19:43
01 | Spring Security 架構及核心類Spring Security 中的過濾器鏈

Spring Security 中采用的是管道-過濾器(Pipe-Filter)架構模式,這些過濾器鏈,構成了 Spring Security 的核心。如下圖所示:

Spring Boot構建系統安全層的步驟

項目一旦啟動,過濾器鏈將會實現自動配置,如下圖所示:

Spring Boot構建系統安全層的步驟

UsernamePasswordAuthenticationFilter 用來檢查輸入的用戶名和密碼,代碼如下:

public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter { public Authentication attemptAuthentication(HttpServletRequest request,HttpServletResponse response) throws AuthenticationException {if (postOnly && !request.getMethod().equals('POST')) { throw new AuthenticationServiceException('Authentication method not supported: ' + request.getMethod());} String username = obtainUsername(request);String password = obtainPassword(request); if (username == null) { username = '';} if (password == null) { password = '';} username = username.trim(); UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);// Allow subclasses to set the 'details' propertysetDetails(request, authRequest);return this.getAuthenticationManager().authenticate(authRequest); } …}

BasicAuthenticationFilter 用來認證用戶的身份。

FilterSecurityInterceptor 用來判定該請求是否能夠訪問目標 HTTP 端點。

Spring Security 中的核心類

Spring Boot構建系統安全層的步驟

SecurityContextHolder 存儲了應用的安全上下文對象 SecurityContext,包含系統請求中最近使用的認證信息。

一個 HTTP 請求到達系統后,將通過一系列的 Filter 完成用戶認證,然后具體的工作交由 AuthenticationManager 完成,AuthenticationManager 成功驗證后會返回填充好的 Authentication 實例。

AuthenticationManager 是一個接口,其實現類 ProviderManager 會進一步依賴 AuthenticationProvider 接口完成具體的認證工作。

在 Spring Security 中存在一大批 AuthenticationProvider 接口的實現類,分別完成各種認證操作。在執行具體的認證工作時,Spring Security 勢必會使用用戶詳細信息,UserDetailsService 服務就是用來對用戶詳細信息實現管理。

02 | 基于 Spring Security 構建用戶認證體系

在 Spring Boot 中整合 Spring Security 框架首先需要引入依賴:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>

只要我們在代碼工程中添加了上述依賴,包含在該工程中的所有 HTTP 端點都將被保護起來。

在引入 spring-boot-starter-security 依賴之后,Spring Security 會默認創建一個用戶名為“user”的賬號。當我們訪問 AccountController 的 “accounts/{accountId}” 端點時,彈出如下界面:

Spring Boot構建系統安全層的步驟

同時,控制臺日志打印如下:

Using generated security password: 17bbf7c4-456a-48f5-a12e-a680066c8f80

因此,訪問該接口需要設置如下信息:

Spring Boot構建系統安全層的步驟

每次啟動應用時,通過 Spring Security 自動生成的密碼都會有所變化。如果我們想設置登錄賬號和密碼,可以在 application.yml 中配置如下:

spring: security: user: name: springcss password: springcss_password配置 Spring Security

初始化用戶信息所依賴的配置類是 WebSecurityConfigurer 接口,在日常開發中,我們往往是使用 WebSecurityConfigurerAdapter 類并覆寫其中的 configure(AuthenticationManagerBuilder auth) 的方法完成配置工作。

使用 AuthenticationManagerBuilder 類創建一個 AuthenticationManager 就能夠輕松實現基于內存、LADP 和 JDBC 的驗證。初始化所使用的用戶信息只需要指定用戶名(Username)、密碼(Password)和角色(Role)這三項數據即可。

使用基于內存的用戶信息存儲方案

@Overrideprotected void configure(AuthenticationManagerBuilder builder) throws Exception { builder.inMemoryAuthentication().withUser('springcss_user').password('password1')// 或者使用.authorities('ROLE_USER').roles('USER').and().withUser('springcss_admin').password('password2').roles('USER', 'ADMIN');}

使用基于數據庫的用戶信息存儲方案

表結構如下:

create table users( username varchar_ignorecase(50) not null primary key, password varchar_ignorecase(500) not null, enabled boolean not null); create table authorities ( username varchar_ignorecase(50) not null, authority varchar_ignorecase(50) not null, constraint fk_authorities_users foreign key(username) references users(username)); create unique index ix_auth_username on authorities (username,authority);

Spring Security 的配置代碼如下:

@AutowiredDataSource dataSource; @Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery('select username, password, enabled from Users where username=?').authoritiesByUsernameQuery('select username, authority from UserAuthorities where username=?').passwordEncoder(new BCryptPasswordEncoder());}實現定制化用戶認證方案

擴展 UserDetails

public class SpringCssUser implements UserDetails { private static final long serialVersionUID = 1L; private Long id; private final String username; private final String password; private final String phoneNumber; // 省略getter/setter // 省略重寫方法}

擴展 UserDetailsService

@Servicepublic class SpringCssUserDetailsService implements UserDetailsService { @Autowired private SpringCssUserRepository repository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {SpringCssUser user = repository.findByUsername(username);if (user != null) { return user;}throw new UsernameNotFoundException('SpringCSS User ’' + username + '’ not found'); }}

整合定制化配置

@Configurationpublic class SpringCssSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired SpringCssUserDetailsService springCssUserDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(springCssUserDetailsService); }}03 | 基于 Spring Security 實現安全訪問

在日常開發過程中,我們需要對 Web 應用中的不同 HTTP 端點進行不同粒度的權限控制。

對 HTTP 端點進行訪問授權管理

使用配置方法

配置方法也是位于 WebSecurityConfigurerAdapter 類中,但使用的是 configure(HttpSecurity http) 方法,如下代碼所示:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests()// 所有請求都需要認證.anyRequest()// 允許認證用戶訪問.authenticated().and()// 需要使用表單進行登錄.formLogin().and()// 使用 HTTP Basic Authentication 方法完成認證.httpBasic();}

Spring Security 還提供了一個 access() 方法,允許開發人員傳入一個表達式進行更細粒度的權限控制,這里,我們將引入Spring 框架提供的一種動態表達式語言—— SpEL(Spring Expression Language 的簡稱)。

只要 SpEL 表達式的返回值為 true,access() 方法就允許用戶訪問,如下代碼所示:

@Overridepublic void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers('/orders').access('hasRole(’ROLE_USER’)');}

使用注解Spring Security 提供了 @PreAuthorize 注解也可以實現類似的效果,使用該注解代碼如下所示:

@RestController@RequestMapping(value='orders')public class OrderController { @PostMapping(value = '/') @PreAuthorize('hasRole(ROLE_ADMIN)') public void addOrder(@RequestBody Order order) {… }}

@PostAuthorize 主要用于請求結束之后檢查權限。

實現多維度訪問授權方案

使用用戶級別保護服務訪問該級別是最基本的資源保護級別,只要是認證用戶就可能訪問服務內的各種資源。

@Configurationpublic class SpringCssSecurityConfig extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests() .anyRequest() .authenticated(); }}

使用用戶+角色級別保護服務訪問該級別在認證用戶級別的基礎上,還要求用戶屬于某一個或多個特定角色。

@Configurationpublic class SpringCssSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers('/customers/**') .hasRole('ADMIN') .anyRequest() .authenticated(); }}

上述代碼表示只有'ADMIN'角色的認證用戶才能訪問以'/customers/'為根地址的所有 URL。

使用用戶+角色+操作級別保護服務訪問該級別在認證用戶+角色級別的基礎上,對某些 HTTP 操作方法做了訪問限制。

@Configurationpublic class SpringCssSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception{http.authorizeRequests().antMatchers(HttpMethod.DELETE, '/customers/**').hasRole('ADMIN').anyRequest().authenticated(); }}

上述代碼的效果在于對“/customers”端點執行刪除操作時,我們需要使用具有“ADMIN”角色的“springcss_admin”用戶,否則會出現“access_denied”錯誤信息。

以上就是Spring Boot構建系統安全層的步驟的詳細內容,更多關于Spring Boot構建系統安全層的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
一区二区亚洲视频| 亚洲欧美视频一区二区三区| 日本视频中文字幕一区二区三区| 色乱码一区二区三区网站| 国产精品宾馆| 久久精品一区二区国产| 精品国产91| 日韩视频一区| 日韩精品欧美大片| 日韩综合一区| 好看不卡的中文字幕| 日韩欧美精品一区二区综合视频| 一区福利视频| 日韩激情中文字幕| 精品国产麻豆| 欧美午夜不卡影院在线观看完整版免费 | 国产精品伦理久久久久久| 性欧美videohd高精| 欧美日韩精品免费观看视欧美高清免费大片 | 成人精品高清在线视频| 视频一区二区欧美| 色婷婷精品视频| 久久九九99| 国产午夜久久av| 天堂√8在线中文| 亚洲综合中文| 92国产精品| 国产亚洲人成a在线v网站| 久久网站免费观看| 欧美xxxx性| 蜜桃视频第一区免费观看| 水蜜桃久久夜色精品一区| 亚洲最大av| 美女国产一区| 欧美特黄一级| 免费在线小视频| 蜜桃久久久久| 亚洲日产国产精品| 蜜桃国内精品久久久久软件9| 国产精品99久久免费观看| 爽爽淫人综合网网站| 久久免费大视频| 日韩在线欧美| 日本一区二区免费高清| 国产麻豆精品| 日韩精品高清不卡| 亚洲精品福利| 日韩中文字幕亚洲一区二区va在线| 偷拍精品精品一区二区三区| 国产精品videossex| 欧美日韩一区自拍| 亚洲青青久久| 一区在线免费| 91高清一区| 99精品国产一区二区三区| caoporn视频在线| 中文字幕在线视频久| 成人精品国产亚洲| 欧美久久天堂| 99国产精品一区二区| 亚洲精品在线观看91| 欧美日韩四区| 影音先锋久久精品| 日本欧美一区二区在线观看| 91成人精品在线| 国产剧情在线观看一区| 麻豆久久久久久久| 国产毛片一区二区三区| 精品视频免费| 婷婷亚洲五月| 亚洲欧洲av| 另类综合日韩欧美亚洲| 免费高潮视频95在线观看网站| 1024精品久久久久久久久| 久久高清一区| 国产精品一区三区在线观看| 国产精品蜜芽在线观看| 狠狠色综合网| 日韩在线成人| 98精品久久久久久久| 在线亚洲成人| 欧美影院视频| 黄毛片在线观看| 亚洲一区二区三区四区五区午夜| 噜噜噜躁狠狠躁狠狠精品视频| 欧美日韩一区二区三区在线电影| 成人日韩精品| 日本欧美一区二区| 欧美激情国产在线| 免费观看日韩电影| 日韩综合在线| 色综合视频一区二区三区日韩| 国产suv精品一区| 蜜桃久久久久久久| 精品视频国内| 免费看日韩精品| 福利一区视频| 免费日韩av片| 国产伦久视频在线观看| 一二三区精品| 欧美+亚洲+精品+三区| 捆绑调教美女网站视频一区| 久热re这里精品视频在线6| 色综合五月天| 老司机精品视频网| 欧美日韩网址| 蜜臀va亚洲va欧美va天堂 | 国产亚洲久久| 国产精品试看| 亚洲天堂成人| 久久久精品区| 国产精品亚洲人成在99www| 久久国产成人| 久久亚洲色图| 蜜桃91丨九色丨蝌蚪91桃色| 蜜臀av国产精品久久久久| 综合国产精品| 久久爱www.| 精品一区二区三区视频在线播放| 黄毛片在线观看| 日韩一区欧美二区| 国产一区二区精品福利地址| 国产成人精品福利| 午夜影院一区| 尤物在线精品| 婷婷综合在线| 国产精品毛片在线看| 日韩av中文字幕一区二区三区| 日本va欧美va欧美va精品| 国产精品一区亚洲| 日本一区二区高清不卡| 亚洲国产一区二区三区在线播放| 亚洲午夜黄色| 中文字幕av一区二区三区人| 青青草国产精品亚洲专区无| 国产精品对白久久久久粗| 国产精品99久久免费观看| 欧美三区不卡| 香蕉久久99| 日本视频在线一区| 国产精品mm| 欧美日韩国产高清电影| 亚洲bt欧美bt精品777| 国产在线视频欧美一区| 日韩亚洲国产欧美| 久久精品资源| 国产成人精品一区二区免费看京 | 亚洲精品午夜av福利久久蜜桃| 久热综合在线亚洲精品| 日韩av网站在线免费观看| 久久久久亚洲精品中文字幕| 99精品综合| 国产精品白丝一区二区三区| 亚洲天堂久久| 国模精品一区| 在线一区二区三区视频| 久久久久久自在自线| 亚洲97av| 欧美另类综合| 久久精品国产99国产| 亚欧洲精品视频在线观看| 久久精品高清| 国语精品一区| 久久国内精品视频| 亚洲专区欧美专区| 久久精品亚洲| 日韩超碰人人爽人人做人人添| 91精品蜜臀一区二区三区在线| 久久精品国产99国产精品| 欧美日韩一区二区三区不卡视频| 丝袜亚洲另类欧美| 亚洲一区二区免费看| 美国欧美日韩国产在线播放| 国产精品日韩欧美一区| 亚洲欧美日韩国产| 天堂av在线一区| 日韩中文欧美在线| 亚洲日韩中文字幕一区| 蜜桃视频在线网站| 国产日本精品| 蜜桃精品在线| 国产欧美日韩在线观看视频| 亚洲综合精品| 国产视频久久| 99视频精品全国免费| 久久麻豆视频| 国产欧美二区| 日韩av一区二区在线影视| 乱人伦精品视频在线观看| 亚洲午夜天堂| 加勒比视频一区| 精品久久久久中文字幕小说| 国产欧美一区二区三区米奇| 亚洲欧美专区| 一区二区三区午夜视频| 不卡在线一区| 国产精品视频3p| 日韩精品国产精品| 欧美中文一区| 国产精品丝袜在线播放|