目錄
一、什麼是 Spring Security
二、如何引進 Spring Security
三、如何設定 Spring Security
四、如何使用 Spring Security
五、取得目前登入使用者權限
總結一下
首頁 電腦教學 電腦知識 Spring Security權限控制框架使用指南

Spring Security權限控制框架使用指南

Feb 18, 2024 pm 05:00 PM
spring security spring security spring mvc waynboot

Spring Security权限控制框架使用指南

在背景管理系統中,通常需要存取權限控制,以限制不同使用者對介面的存取能力。如果使用者缺乏特定權限,則無法存取某些介面。

本文將用 waynboot-mall 專案舉例,為大家介紹常見後管系統如何引入權限控制框架 Spring Security。大綱如下:

waynboot-mall 專案網址:https://github.com/wayn111/waynboot-mall

一、什麼是 Spring Security

Spring Security 是一個基於 Spring 框架的開源項目,旨在為 Java 應用程式提供強大且靈活的安全解決方案。 Spring Security 提供了以下特性:

  • 認證:支援多種認證機制,如表單登入、HTTP 基本認證、OAuth2、OpenID 等。
  • 授權:支援基於角色或權限的存取控制,以及基於表達式的細粒度控制。
  • 防護:提供了多種防護措施,例如防止會話固定、點擊劫持、跨站請求偽造等攻擊。
  • 整合:與 Spring 框架和其他第三方程式庫和框架進行無縫集成,如 Spring MVC、Thymeleaf、Hibernate 等。

二、如何引進 Spring Security

在 waynboot-mall 專案中直接引入 spring-boot-starter-security 依賴,


org.springframework.boot
spring-boot-starter-security
3.1.0

登入後複製

三、如何設定 Spring Security

在 Spring Security 3.0 中要設定 Spring Security 跟以往是有些不同的,例如不在繼承 WebSecurityConfigurerAdapter。在 waynboot-mall 專案中,具體配置如下,

@Configuration
@EnableWebSecurity
@AllArgsConstructor
@EnableMethodSecurity(securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig {
private UserDetailsServiceImpl userDetailsService;
private AuthenticationEntryPointImpl unauthorizedHandler;
private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
private LogoutSuccessHandlerImpl logoutSuccessHandler;

@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// cors启用
.cors(httpSecurityCorsConfigurer -> {})
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(httpSecuritySessionManagementConfigurer -> {
httpSecuritySessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
})
.exceptionHandling(httpSecurityExceptionHandlingConfigurer -> {
httpSecurityExceptionHandlingConfigurer.authenticationEntryPoint(unauthorizedHandler);
})
// 过滤请求
.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> {
authorizationManagerRequestMatcherRegistry
.requestMatchers("/favicon.ico", "/login", "/favicon.ico", "/actuator/**").anonymous()
.requestMatchers("/slider/**").anonymous()
.requestMatchers("/captcha/**").anonymous()
.requestMatchers("/upload/**").anonymous()
.requestMatchers("/common/download**").anonymous()
.requestMatchers("/doc.html").anonymous()
.requestMatchers("/swagger-ui/**").anonymous()
.requestMatchers("/swagger-resources/**").anonymous()
.requestMatchers("/webjars/**").anonymous()
.requestMatchers("/*/api-docs").anonymous()
.requestMatchers("/druid/**").anonymous()
.requestMatchers("/elastic/**").anonymous()
.requestMatchers("/message/**").anonymous()
.requestMatchers("/ws/**").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})
.headers(httpSecurityHeadersConfigurer -> {
httpSecurityHeadersConfigurer.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable);
});
// 处理跨域请求中的Preflight请求(cors),设置corsConfigurationSource后无需使用
// .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
// 对于登录login 验证码captchaImage 允许匿名访问

httpSecurity.logout(httpSecurityLogoutConfigurer -> {
httpSecurityLogoutConfigurer.logoutUrl("/logout");
httpSecurityLogoutConfigurer.logoutSuccessHandler(logoutSuccessHandler);
});
// 添加JWT filter
httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 认证用户时用户信息加载配置,注入springAuthUserService
httpSecurity.userDetailsService(userDetailsService);
return httpSecurity.build();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
/**
 * 强散列哈希加密实现
 */
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
登入後複製

這裡詳細介紹下 SecurityConfig 設定類別:

  • filterChain(HttpSecurity httpSecurity) 方法是存取控制的核​​心方法,這裡面可以針對 url 設定是否需要權限認證、cors 設定、csrf 設定、使用者資訊載入設定、jwt 過濾器攔截設定等眾多功能。
  • authenticationManager(AuthenticationConfiguration authenticationConfiguration) 方法適用於啟用認證接口,需要手動聲明,否則啟動報錯。
  • bCryptPasswordEncoder() 方法使用者定義使用者登入時的密碼加密策略,需要手動聲明,否則啟動報錯。

四、如何使用 Spring Security

要使用 Spring Security,只需要在需要控制存取權的方法或類別上新增對應的 @PreAuthorize 註解即可,如下,

@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("system/role")
public class RoleController extends BaseController {

private IRoleService iRoleService;

@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/list")
public R list(Role role) {
Page page = getPage();
return R.success().add("page", iRoleService.listPage(page, role));
}
}
登入後複製

我們在list 方法上加了 @PreAuthorize(“@ss.hasPermi('system:role:list')”) 註解表示目前登入使用者擁有system:role:list 權限才能存取list 方法,否則回傳權限錯誤。

五、取得目前登入使用者權限

在 SecurityConfig 設定類別中我們定義了 UserDetailsS​​erviceImpl 作為我們的使用者資訊載入的實作類,從而透過讀取資料庫中使用者的帳號、密碼與前端傳入的帳號、密碼進行比對。程式碼如下,

@Slf4j
@Service
@AllArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {

private IUserService iUserService;

private IDeptService iDeptService;

private PermissionService permissionService;

public static void main(String[] args) {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
System.out.println(bCryptPasswordEncoder.encode("123456"));
}

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 1. 读取数据库中当前用户信息
User user = iUserService.getOne(new QueryWrapper().eq("user_name", username));
// 2. 判断该用户是否存在
if (user == null) {
log.info("登录用户:{} 不存在.", username);
throw new UsernameNotFoundException("登录用户:" + username + " 不存在");
}
// 3. 判断是否禁用
if (Objects.equals(UserStatusEnum.DISABLE.getCode(), user.getUserStatus())) {
log.info("登录用户:{} 已经被停用.", username);
throw new DisabledException("登录用户:" + username + " 不存在");
}
user.setDept(iDeptService.getById(user.getDeptId()));
// 4. 获取当前用户的角色信息
Set rolePermission = permissionService.getRolePermission(user);
// 5. 根据角色获取权限信息
Set menuPermission = permissionService.getMenuPermission(rolePermission);
return new LoginUserDetail(user, menuPermission);
}
}
登入後複製

針對 UserDetailsS​​erviceImpl 的程式碼邏輯進行一個講解,大家可以配合程式碼理解。

  • 讀取資料庫中目前使用者資訊
  • 判斷該使用者是否存在
  • 判斷是否停用
  • 取得目前使用者的角色資訊
  • 根據角色取得權限資訊

總結一下

本文告訴大家來說明了後管系統如何引入權限控制框架 Spring Security 3.0 版本以及程式碼實戰。相信能幫助大家對權限控制框架 Spring Security 有一個清晰的理解。後續大家可以按照本文的使用指南一步一步將 Spring Security 引入的自己的專案中用於存取權限控制。

以上是Spring Security權限控制框架使用指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
Spring Security 6:cors() 已棄用並標記為刪除 Spring Security 6:cors() 已棄用並標記為刪除 Feb 10, 2024 pm 11:45 PM

我有下面的程式碼:publicSecurityFilterChainsecurityFilterChain(HttpSecurityhttp)throwsException{returnhttp.httpBasic().disable().cors().and().csrf().disable().authorizeHttpRequests().requestMatchers("

解決kernel_security_check_failure藍色畫面的17種方法 解決kernel_security_check_failure藍色畫面的17種方法 Feb 12, 2024 pm 08:51 PM

Kernelsecuritycheckfailure(內核檢查失敗)就是一個比較常見的停止代碼類型,可藍屏錯誤出現不管是什麼原因都讓很多的有用戶們十分的苦惱,下面就讓本站來為用戶們來仔細的介紹一下17種解決方法吧。 kernel_security_check_failure藍色畫面的17種解決方法方法1:移除全部外部裝置當您使用的任何外部裝置與您的Windows版本不相容時,則可能會發生Kernelsecuritycheckfailure藍色畫面錯誤。為此,您需要在嘗試重新啟動電腦之前拔下全部外部裝置。

編程新範式,當Spring Boot遇上OpenAI 編程新範式,當Spring Boot遇上OpenAI Feb 01, 2024 pm 09:18 PM

2023年,AI技術已成為熱門話題,對各行業產生了巨大影響,程式設計領域尤其如此。人們越來越認識到AI技術的重要性,Spring社群也不例外。隨著GenAI(GeneralArtificialIntelligence)技術的不斷進步,簡化具備AI功能的應用程式的創建變得至關重要和迫切。在這個背景下,"SpringAI"應運而生,旨在簡化開發AI功能應用程式的過程,使其變得簡單直觀,避免不必要的複雜性。透過"SpringAI",開發者可以更輕鬆地建立具備AI功能的應用程序,將其變得更加易於使用和操作

利用Spring Boot以及Spring AI建構生成式人工智慧應用 利用Spring Boot以及Spring AI建構生成式人工智慧應用 Apr 28, 2024 am 11:46 AM

Spring+AI作為行業領導者,透過其強大、靈活的API和先進的功能,為各種行業提供了領先性的解決方案。在本專題中,我們將深入探討Spring+AI在各領域的應用範例,每個案例都將展示Spring+AI如何滿足特定需求,實現目標,並將這些LESSONSLEARNED擴展到更廣泛的應用。希望這個專題能對你有所啟發,更深入地理解和利用Spring+AI的無限可能。 Spring框架在軟體開發領域已經有超過20年的歷史,自SpringBoot1.0版本發布以來已有10年。現在,無人會質疑,Spring

spring編程式事務有哪些實作方式 spring編程式事務有哪些實作方式 Jan 08, 2024 am 10:23 AM

spring編程式事務的實作方式:1、使用TransactionTemplate;2、使用TransactionCallback和TransactionCallbackWithoutResult;3、使用Transactional註解;4、使用TransactionTemplate和@Transactional結合使用;5、自訂事務管理器。

Spring如何設定事務隔離級別 Spring如何設定事務隔離級別 Jan 26, 2024 pm 05:38 PM

Spring設定事務隔離等級的方法:1、使用@Transactional註解;2、在Spring設定檔中設定;3、使用PlatformTransactionManager;4、在Java配置類別中設定。詳細介紹:1、使用@Transactional註解,在需要進行事務管理的類別或方法上加入@Transactional註解,並在屬性中設定隔離等級;2、在Spring設定檔等等。

java中controller包的作用 java中controller包的作用 May 07, 2024 am 02:45 AM

Spring MVC 架構中,Controller 套件透過處理使用者請求並回傳回應來實現業務邏輯,職責包括:接收使用者請求(通常透過 HTTP)。驗證和處理請求參數。呼叫適當的業務邏輯(通常是服務層)。渲染視圖並傳回給使用者(通常是 HTML、JSON 或 XML)。

GO 驗證存取權令牌(keycloak) GO 驗證存取權令牌(keycloak) Feb 09, 2024 am 09:30 AM

我正在嘗試使用GO實現存取令牌驗證。但我在網路上看到的例子似乎只是用TOKEN_SECRET來驗證它。但是我習慣了在Javaspring中編程,並且不需要使用TOKEN_SECRET。我只是提供jwk-set-uri,它會檢查有效性(自動-安全過濾器等),我知道它與oauth伺服器通訊並進行此驗證。 Go中是否沒有函式庫可以透過向oauth伺服器發出請求來檢查令牌是否有效?我知道我知道我可以透過向oauth伺服器的用戶資訊端點發出請求來手動進行此操作:http://localh

See all articles