自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

經(jīng)過(guò)我翻來(lái)覆去的思想斗爭(zhēng)了一個(gè)月,最后做出了一個(gè)明智的決定

開發(fā) 開發(fā)工具
最近寫了幾個(gè)Spring Boot組件,項(xiàng)目用什么功能就引入對(duì)應(yīng)的依賴,配置配置就能使用,香的很!那么Spring Security能不能也弄成模塊化,簡(jiǎn)單配置一下就可以用上呢?

[[395754]]

最近寫了幾個(gè)Spring Boot組件,項(xiàng)目用什么功能就引入對(duì)應(yīng)的依賴,配置配置就能使用,香的很!那么Spring Security能不能也弄成模塊化,簡(jiǎn)單配置一下就可以用上呢?JWT得有,RBAC動(dòng)態(tài)權(quán)限更得有!花了小半天就寫了個(gè)組件,用了一個(gè)月感覺(jué)還不錯(cuò)。是我一個(gè)人爽?還是放出來(lái)讓大家一起爽?經(jīng)過(guò)我翻來(lái)覆去的思想斗爭(zhēng)了一個(gè)月,最后做出了一個(gè)明智的決定,放出來(lái)讓想直接上手的同學(xué)直接使用。源碼地址就在下面:

https://gitee.com/felord/security-enhance-spring-boot

用法

集成

這就是一個(gè)Spring Boot Starter,你自己打包、安裝。然后引用到項(xiàng)目:

  1. <dependency> 
  2.             <groupId>cn.felord.security</groupId> 
  3.             <artifactId>security-enhance-spring-boot-starter</artifactId> 
  4.             <version>${version}</version> 
  5.         </dependency> 

另外你需要集成Spring Cache,比如Redis Cache:

  1. <dependency> 
  2.       <groupId>org.springframework.boot</groupId> 
  3.       <artifactId>spring-boot-starter-cache</artifactId> 
  4.   </dependency> 
  5.   <dependency> 
  6.       <groupId>org.springframework.boot</groupId> 
  7.       <artifactId>spring-boot-starter-data-redis</artifactId> 
  8.   </dependency> 
  9.   <dependency> 
  10.       <groupId>org.apache.commons</groupId> 
  11.       <artifactId>commons-pool2</artifactId> 
  12.   </dependency> 

JWT會(huì)被緩存到以u(píng)srTkn為key的緩存中,如果你想定制的話,自行實(shí)現(xiàn)一個(gè)JwtTokenStorage并注入Spring IoC就可以覆蓋下面的配置了:

  1. @Bean 
  2.     @ConditionalOnMissingBean 
  3.     public JwtTokenStorage jwtTokenStorage() { 
  4.         return new SpringCacheJwtTokenStorage(); 
  5.     } 

你應(yīng)該去了解如何自定義Spring Cache的過(guò)期時(shí)間。

數(shù)據(jù)庫(kù)表設(shè)計(jì)

然后是數(shù)據(jù)庫(kù)表設(shè)計(jì),這里簡(jiǎn)單點(diǎn)弄個(gè)RBAC的設(shè)計(jì),僅供參考,你可以根據(jù)你們的業(yè)務(wù)改良。

用戶表:

user_id username password
1312434534 felord {noop}12345

角色表:

role_id role_name role_code
12343667867 管理員 ADMIN

用戶角色關(guān)聯(lián)表:

user_role_id user_id role_id
12354657777 1312434534 12343667867

一個(gè)用戶可以持有多個(gè)角色,一個(gè)角色在一個(gè)用戶持有的角色集合中是唯一的。

資源表:

resources_id resources_name resource_pattern method
12543667867 根據(jù)ID獲取商品 /goods/{goodsId} GET

資源其實(shí)就是我們寫的Spring MVC接口,這里支持ANT風(fēng)格,但是盡量具體,為了靈活性考慮不推薦使用通配符。

角色資源表:

role_res_id role_id resources_id
4545466445 12343667867 12543667867

一個(gè)資源可以關(guān)聯(lián)多個(gè)角色,一個(gè)角色不能重復(fù)持有一個(gè)資源。

實(shí)現(xiàn)UserDetailsService

實(shí)現(xiàn)用戶加載服務(wù)接口UserDetailsService是Spring Security開發(fā)的必要步驟,跟我以前的教程差不多。

  1. @Override 
  2. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
  3.  
  4.     UserInfo userInfo = this.lambdaQuery() 
  5.             .eq(UserInfo::getUsername, username).one(); 
  6.  
  7.     if (Objects.isNull(userInfo)) { 
  8.         throw new UsernameNotFoundException("用戶:" + username + " 不存在"); 
  9.     } 
  10.  
  11.     String userId = userInfo.getUserId(); 
  12.     boolean enabled = userInfo.getEnabled(); 
  13.  
  14.     Set<String> roles = iUserRoleService.getRolesByUserId(userId); 
  15.     roles.add(“"ANONYMOUS"”); 
  16.     Set<GrantedAuthority> roleSet = roles.stream() 
  17.             .map(role -> new SimpleGrantedAuthority("ROLE_" + role)) 
  18.             .collect(Collectors.toSet()); 
  19.     return new SecureUser(userId, 
  20.             username, 
  21.             userInfo.getSecret(), 
  22.             enabled, 
  23.             enabled, 
  24.             enabled, 
  25.             enabled, 
  26.             roleSet); 

這里要說(shuō)一下里面為啥要內(nèi)置一個(gè)ANONYMOUS角色給用戶。如果希望特定的資源對(duì)用戶全量開放,可配置對(duì)應(yīng)的權(quán)限角色編碼為ANONYMOUS。當(dāng)某個(gè)資源的角色編碼為ANONYMOUS時(shí),即使不攜帶Token也可以訪問(wèn)。一般情況下匿名能訪問(wèn)的資源不匿名一定能訪問(wèn),當(dāng)然你如果不希望這樣的規(guī)則存在干掉就是了。

查詢用戶的權(quán)限集

實(shí)現(xiàn)用戶角色權(quán)限方法Function

配置

最后就是配置了,跟我以前教程中的配置幾乎一樣,application.yaml的配置為:

  1. # jwt 配置 
  2. jwt: 
  3.   cert-info: 
  4.    # keytool 密鑰的 alias  
  5.     alias: felord 
  6.     # 密匙密碼 
  7.     key-password: i6x123akg15v13 
  8.     # 路徑 這里是在resources 包下 
  9.     cert-location: jwt.jks 
  10.   claims: 
  11.     # jwt iss 字段值 
  12.     issuer: https://felord.cn 
  13.     # sub 字段 
  14.     subject: all 
  15.     # 過(guò)期秒數(shù) 
  16.     expires-at: 604800 

最后別忘記弄個(gè)配置類并標(biāo)記@EnableSpringSecurity以啟用配置:

  1. @EnableSpringSecurity 
  2. @Configuration(proxyBeanMethods = false
  3. public class SecurityConfiguration { 
  4.  
  5.     /** 
  6.      * Function function
  7.      * 
  8.      * @param resourcesService the resources service 
  9.      * @return the function 
  10.      */ 
  11.     @Bean 
  12.     Function<Set<String>, Set<AntPathRequestMatcher>> function(IResourcesService resourcesService){ 
  13.         return resourcesService::matchers; 
  14.     } 
  15.      
  16.     @Bean 
  17.     UserDetailsService userDetailsService(IUserInfoService userInfoService){ 
  18.         return userInfoService::loadUserByUsername;  
  19.     } 
  20.  

記得使用@EnableCaching開啟并配置緩存。

使用

登錄接口

  1. POST /login?username=felord&password=12345 HTTP/1.1 
  2. Host: localhost:8080 

然后會(huì)返回一對(duì)JWT,返回包含兩個(gè)token主體

  • accessToken 用來(lái)日常進(jìn)行請(qǐng)求鑒權(quán),有過(guò)期時(shí)間。
  • refreshToken 當(dāng)accessToken過(guò)期失效時(shí),用來(lái)刷新accessToken。

結(jié)構(gòu)為:

  1.   "accessToken": { 
  2.     "tokenValue"""
  3.     "issuedAt": { 
  4.       "epochSecond": 1616827822, 
  5.       "nano": 393000000 
  6.     }, 
  7.     "expiresAt": { 
  8.       "epochSecond": 1616831422, 
  9.       "nano": 393000000 
  10.     }, 
  11.     "tokenType": { 
  12.       "value""Bearer" 
  13.     }, 
  14.     "scopes": [ 
  15.       "ROLE_ADMIN"
  16.       "ROLE_ANONYMOUS" 
  17.     ] 
  18.   }, 
  19.   "refreshToken": { 
  20.     "tokenValue"""
  21.     "issuedAt": { 
  22.       "epochSecond": 1616827822, 
  23.       "nano": 393000000 
  24.     }, 
  25.     "expiresAt"null 
  26.   }, 
  27.   "additionalParameters": {} 

調(diào)用根據(jù)ID獲取商品接口時(shí)加入Token:

  1. GET /goods/234355451 HTTP/1.1 
  2. Host: localhost:8080 
  3. Authorization: Bearer eyJraWQImFsZyI6IlJTMjU2In0.eyJzdWIiOiJ1NzgsImlhdCI6MTYxNjkxODk3OCwianRpIjoiNThlOTQktNGVlYzc3MDU0ZDk3In0.ZQcN0FX7_taohqPiC1KnoF7 

本文轉(zhuǎn)載自微信公眾號(hào)「碼農(nóng)小胖哥」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼農(nóng)小胖哥公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 碼農(nóng)小胖哥
相關(guān)推薦

2021-11-18 07:29:56

AST操作ESBuild

2018-01-10 12:09:12

Android開發(fā)程序員

2018-09-04 15:15:56

程序員開發(fā)時(shí)間

2021-10-28 05:39:14

Windows 10操作系統(tǒng)微軟

2013-05-27 09:47:33

Java開發(fā)Java跨平臺(tái)

2009-11-23 08:52:02

Windows 7首月銷量

2019-10-08 11:07:55

Python 開發(fā)編程語(yǔ)言

2016-01-11 19:38:51

七牛

2019-04-01 14:17:36

kotlin開發(fā)Java

2012-08-31 16:40:24

Mac操作系統(tǒng)

2021-07-20 08:57:26

滴滴上市網(wǎng)絡(luò)安全審查

2010-09-14 16:09:49

sql日期函數(shù)

2022-12-05 18:17:06

技術(shù)

2009-02-16 09:15:49

蘋果喬布斯CEO

2012-12-20 10:18:10

Windows 8

2013-08-12 16:35:22

2019-03-11 08:36:00

Office 應(yīng)用微軟

2024-08-05 09:25:00

AI測(cè)評(píng)

2021-01-05 15:15:23

人工智能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)