Panduan penggunaan rangka kerja kawalan kebenaran Spring Security

WBOY
Lepaskan: 2024-02-18 17:00:04
ke hadapan
1259 orang telah melayarinya

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

Dalam sistem pengurusan bahagian belakang, kawalan kebenaran akses biasanya diperlukan untuk mengehadkan keupayaan pengguna yang berbeza untuk mengakses antara muka. Jika pengguna tidak mempunyai kebenaran khusus, dia tidak boleh mengakses antara muka tertentu.

Artikel ini akan menggunakan projek waynboot-mall sebagai contoh untuk memperkenalkan cara memperkenalkan rangka kerja kawalan kebenaran Spring Security ke dalam sistem pengurusan back-end biasa. Rangkanya adalah seperti berikut:

waynboot-mall alamat projek: https://github.com/wayn111/waynboot-mall

1. Apakah itu Spring Security

Spring Security ialah projek sumber terbuka berdasarkan rangka kerja Spring, direka untuk menyediakan penyelesaian keselamatan yang berkuasa dan fleksibel untuk aplikasi Java. Spring Security menyediakan ciri-ciri berikut:

  • Pengesahan: Menyokong pelbagai mekanisme pengesahan, seperti log masuk borang, pengesahan asas HTTP, OAuth2, OpenID, dsb.
  • Keizinan: Menyokong kawalan akses berasaskan peranan atau kebenaran, serta kawalan terperinci berasaskan ekspresi.
  • Perlindungan: Menyediakan pelbagai langkah perlindungan, seperti mencegah penetapan sesi, rampasan klik, pemalsuan permintaan merentas tapak dan serangan lain.
  • Integrasi: Penyepaduan lancar dengan Spring Framework dan perpustakaan dan rangka kerja pihak ketiga yang lain, seperti Spring MVC, Thymeleaf, Hibernate, dsb.

2. Bagaimana untuk memperkenalkan Spring Security

Memperkenalkan secara langsung pergantungan spring-boot-starter-security ke dalam projek waynboot-mall,


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

Salin selepas log masuk

3. Bagaimana untuk mengkonfigurasi Spring Security

Mengkonfigurasi Spring Security dalam Spring Security 3.0 sedikit berbeza daripada sebelumnya, contohnya, ia tidak lagi mewarisi WebSecurityConfigurerAdapter. Dalam projek waynboot-mall, konfigurasi khusus adalah seperti berikut,

@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();
}
}
Salin selepas log masuk

Berikut ialah pengenalan terperinci kepada kelas konfigurasi SecurityConfig:

    Kaedah
  • filterChain(HttpSecurity httpSecurity) ialah kaedah teras kawalan akses Di sini anda boleh menetapkan sama ada pengesahan kebenaran diperlukan untuk url, konfigurasi cors, konfigurasi csrf, konfigurasi pemuatan maklumat pengguna, konfigurasi pemintasan penapis jwt dan banyak fungsi lain.
  • Kaedah
  • authenticationManager(AuthenticationConfiguration authenticationConfiguration) sesuai untuk mendayakan antara muka pengesahan dan perlu diisytiharkan secara manual, jika tidak, ralat akan dilaporkan semasa permulaan.
  • Kaedah
  • bCryptPasswordEncoder() membenarkan pengguna mentakrifkan dasar penyulitan kata laluan apabila pengguna log masuk. Ia perlu diisytiharkan secara manual, jika tidak, ralat akan dilaporkan semasa permulaan.

4. Cara menggunakan Spring Security

Untuk menggunakan Spring Security, anda hanya perlu menambah anotasi @PreAuthorize yang sepadan pada kaedah atau kelas yang perlu mengawal kebenaran akses, seperti berikut,

@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));
}
}
Salin selepas log masuk

Kami menambahkan anotasi @PreAuthorize(“@ss.hasPermi('system:role:list')”) pada kaedah senarai untuk menunjukkan bahawa pengguna yang sedang log masuk mempunyai kebenaran system:role:list untuk mengakses kaedah senarai, jika tidak ralat kebenaran akan dikembalikan.

5. Dapatkan kebenaran pengguna yang sedang log masuk

Dalam kelas konfigurasi SecurityConfig, kami mentakrifkan UserDetailsServiceImpl sebagai kelas pelaksanaan kami untuk memuatkan maklumat pengguna, untuk membandingkan akaun dan kata laluan pengguna dalam pangkalan data dengan akaun dan kata laluan yang dihantar oleh bahagian hadapan. Kodnya adalah seperti berikut,

@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);
}
}
Salin selepas log masuk

Berikut ialah penjelasan tentang logik kod UserDetailsServiceImpl, supaya anda boleh memahaminya dengan bantuan kod tersebut.

  • Baca maklumat pengguna semasa dalam pangkalan data
  • Tentukan sama ada pengguna itu wujud
  • Tentukan sama ada untuk melumpuhkan
  • Dapatkan maklumat peranan pengguna semasa
  • Dapatkan maklumat kebenaran berdasarkan peranan

Untuk meringkaskan

Artikel ini menerangkan kepada anda cara memperkenalkan rangka kerja kawalan kebenaran versi Spring Security 3.0 ke dalam sistem pengurusan bahagian belakang dan amalan kod. Saya percaya ia boleh membantu semua orang mempunyai pemahaman yang jelas tentang rangka kerja kawalan kebenaran Spring Security. Kemudian, anda boleh mengikuti panduan penggunaan dalam artikel ini untuk memperkenalkan Spring Security ke dalam projek anda sendiri langkah demi langkah untuk kawalan akses.

Atas ialah kandungan terperinci Panduan penggunaan rangka kerja kawalan kebenaran Spring Security. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:mryunwei.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!