Rumah >tutorial komputer >pengetahuan komputer >Panduan penggunaan rangka kerja kawalan kebenaran 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
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:
Memperkenalkan secara langsung pergantungan spring-boot-starter-security ke dalam projek waynboot-mall,
org.springframework.boot spring-boot-starter-security 3.1.0
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(); } }
Berikut ialah pengenalan terperinci kepada kelas konfigurasi SecurityConfig:
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)); } }
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.
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); } }
Berikut ialah penjelasan tentang logik kod UserDetailsServiceImpl, supaya anda boleh memahaminya dengan bantuan kod tersebut.
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!