Nutzungshandbuch für das Spring Security-Berechtigungskontroll-Framework

WBOY
Freigeben: 2024-02-18 17:00:04
nach vorne
1279 Leute haben es durchsucht

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

Im Backend-Verwaltungssystem ist normalerweise eine Zugriffsberechtigungskontrolle erforderlich, um den Zugriff verschiedener Benutzer auf die Schnittstelle einzuschränken. Fehlen einem Benutzer bestimmte Berechtigungen, kann er auf bestimmte Schnittstellen nicht zugreifen.

In diesem Artikel wird das Waynboot-Mall-Projekt als Beispiel verwendet, um vorzustellen, wie das Berechtigungskontroll-Framework Spring Security in gängige Back-End-Verwaltungssysteme eingeführt wird. Die Gliederung lautet wie folgt:

waynboot-mall-Projektadresse: https://github.com/wayn111/waynboot-mall

1. Was ist Spring Security?

Spring Security ist ein Open-Source-Projekt, das auf dem Spring-Framework basiert und darauf ausgelegt ist, leistungsstarke und flexible Sicherheitslösungen für Java-Anwendungen bereitzustellen. Spring Security bietet die folgenden Funktionen:

    Authentifizierung: Unterstützt mehrere Authentifizierungsmechanismen, wie z. B. Formularanmeldung, HTTP-Basisauthentifizierung, OAuth2, OpenID usw.
  • Autorisierung: Unterstützt rollen- oder berechtigungsbasierte Zugriffskontrolle sowie ausdrucksbasierte feinkörnige Kontrolle.
  • Schutz: Bietet eine Vielzahl von Schutzmaßnahmen, z. B. die Verhinderung von Sitzungsfixierungen, Klick-Hijacking, Cross-Site-Request-Forgery und anderen Angriffen.
  • Integration: Nahtlose Integration mit Spring Framework und anderen Bibliotheken und Frameworks von Drittanbietern wie Spring MVC, Thymeleaf, Hibernate usw.
2. So stellen Sie Spring Security vor

Führen Sie die Spring-Boot-Starter-Security-Abhängigkeit direkt in das Waynboot-Mall-Projekt ein,


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

Nach dem Login kopieren

3. So konfigurieren Sie Spring Security

Die Konfiguration von Spring Security in Spring Security 3.0 unterscheidet sich ein wenig von zuvor, zum Beispiel erbt es nicht mehr WebSecurityConfigurerAdapter. Im Waynboot-Mall-Projekt ist die spezifische Konfiguration wie folgt:

@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();
}
}
Nach dem Login kopieren

Hier finden Sie eine detaillierte Einführung in die SecurityConfig-Konfigurationsklasse:

Die Methode
    filterChain(HttpSecurity httpSecurity) ist die Kernmethode der Zugriffskontrolle. Hier können Sie festlegen, ob eine Berechtigungsauthentifizierung für die URL, die CORS-Konfiguration, die CSRF-Konfiguration, die Konfiguration zum Laden von Benutzerinformationen, die Konfiguration des JWT-Filters und viele andere Funktionen erforderlich ist.
  • Die Methode
  • authenticationManager(AuthenticationConfiguration AuthenticationConfiguration) eignet sich zum Aktivieren der Authentifizierungsschnittstelle und muss manuell deklariert werden, andernfalls wird beim Start ein Fehler gemeldet.
  • Mit der Methode
  • bCryptPasswordEncoder() kann der Benutzer die Kennwortverschlüsselungsrichtlinie definieren, wenn er sich anmeldet. Sie muss manuell deklariert werden, andernfalls wird beim Start ein Fehler gemeldet.
4. So verwenden Sie Spring Security

Um Spring Security zu verwenden, müssen Sie nur die entsprechende @PreAuthorize-Annotation zu der Methode oder Klasse hinzufügen, die die Zugriffsberechtigungen steuern muss, wie folgt:

@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));
}
}
Nach dem Login kopieren

Wir haben der Listenmethode die Annotation @PreAuthorize(“@ss.hasPermi('system:role:list')”) hinzugefügt, um anzuzeigen, dass der aktuell angemeldete Benutzer über system:role:list-Berechtigungen für den Zugriff auf die Listenmethode verfügt, andernfalls Es wird ein Berechtigungsfehler zurückgegeben.

5. Holen Sie sich die Berechtigungen des aktuell angemeldeten Benutzers

In der SecurityConfig-Konfigurationsklasse definieren wir UserDetailsServiceImpl als unsere Implementierungsklasse zum Laden von Benutzerinformationen, um das Konto und das Passwort des Benutzers in der Datenbank mit dem vom Frontend übergebenen Konto und Passwort zu vergleichen. Der Code lautet wie folgt:

@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);
}
}
Nach dem Login kopieren

Hier finden Sie eine Erläuterung der Codelogik von UserDetailsServiceImpl, damit Sie sie mithilfe des Codes verstehen können.

    Aktuelle Benutzerinformationen in der Datenbank lesen
  • Stellen Sie fest, ob der Benutzer existiert
  • Bestimmen Sie, ob Sie die Funktion deaktivieren möchten
  • Rufen Sie die Rolleninformationen des aktuellen Benutzers ab
  • Erhalten Sie Berechtigungsinformationen basierend auf der Rolle
Um es zusammenzufassen

In diesem Artikel erfahren Sie, wie Sie die Spring Security 3.0-Version des Berechtigungskontroll-Frameworks in das Back-End-Verwaltungssystem und die Codepraxis einführen. Ich glaube, es kann jedem helfen, ein klares Verständnis des Berechtigungskontroll-Frameworks Spring Security zu erlangen. Später können Sie der Nutzungsanleitung in diesem Artikel folgen, um Spring Security Schritt für Schritt in Ihre eigenen Projekte zur Zugriffskontrolle einzuführen.

Das obige ist der detaillierte Inhalt vonNutzungshandbuch für das Spring Security-Berechtigungskontroll-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:mryunwei.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!