1. Federsicherheitskonzept
pring Security ist ein Sicherheitsframework, das deklarative Sicherheitszugriffskontrolllösungen für Spring-basierte Unternehmensanwendungssysteme bereitstellen kann. Es stellt eine Reihe von Beans bereit, die im Spring-Anwendungskontext konfiguriert werden können und dabei die Funktionen Spring IoC, DI (Inversion of Control, DI: Dependency Injection, Dependency Injection) und AOP (Aspektorientierte Programmierung) vollständig nutzen, um Anwendungssystemen bereitzustellen Die deklarative Sicherheitszugriffskontrollfunktion reduziert den Aufwand, eine Menge sich wiederholenden Codes für die Sicherheitskontrolle von Unternehmenssystemen zu schreiben
2. Begriffe und Konzepte der Autoritätskontrolle
Authentifizierung: Das System überprüft die Zugriffsidentität, bestimmt, ob die Identität auf das System zugreifen kann, ja Analog zum Community-Management im echten Leben können nur Eigentümer, die zur Community gehören, die Community betreten. Die Authentifizierung entspricht einem Tor und nur authentifizierte Identitäten können auf das System zugreifen.
Berechtigungen: Überprüfen Sie, ob die Identität auf die Ressource zugreifen kann, d. h. die Berechtigung zum Zugriff auf die Ressource hat, kann mit der Community-Verwaltung im Leben verglichen werden. Nur Eigentümer, die der Community angehören, können der Community beitreten. Ob Sie jedoch eine bestimmte Einheit betreten können, nachdem Sie der Community beigetreten sind, kann als die Frage angesehen werden, ob Sie über diese verfügen Berechtigung zum Betreten einer bestimmten Einheit
3. Anwendungsszenarien für die Federsicherheit
Spring Security ist ein Mitglied der Spring-Familie. Basierend auf dem Spring-Framework bietet Spring Security eine Komplettlösung für die Sicherheit von Webanwendungen und wird häufig in Hintergrundverwaltungs-Frameworks verwendet. Rechteverwaltung (Authentifizierung und Autorisierung)
4. Anforderungsbeschreibung
Jetzt verwende ich ein einfaches System, das die Funktionen zum Hinzufügen, Löschen, Ändern und Anzeigen von Bestellungen hat. Jetzt möchte ich die Identitäten derjenigen authentifizieren und autorisieren, die auf das System zugreifen, damit es wahr ist anmelden; wenn Sie sich mit dem Konto userAdd anmelden -Konto können Sie nur auf neue Funktionen zugreifen und Bestellfunktionen anzeigen
5. So verwenden Sie Spring Security, um die Berechtigungskontrolle zu implementieren (Anforderungen)
5.1 Einführung in die Abhängigkeit
Führen Sie die Spring-Sicherheitsabhängigkeit in die Maven-POM-Datei ein (sobald die Abhängigkeit eingeführt wurde, werden dem System Funktionen hinzugefügt, die eine Authentifizierung erfordern, d. h. für den Zugriff auf das System ist eine Anmeldung erforderlich).
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
5.2 Federsicherheitskonfigurationsklasse hinzufügen
Die Konfiguration hat drei Funktionen:
Funktion 1: Aktivieren Sie die Filterkettenfunktion durch Annotationen (@EnableWebSecurity)
Funktion 2: Authentifizierungsbenutzer hinzufügen und Berechtigungen, überschreiben Sie die Methode com.yf.config.SecurityConfig#configure(org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder)
Funktionsliste: Regeln zum Abfangen von Ressourcen konfigurieren, Überschreiben Sie die Methode com.yf.config.SecurityConfig#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
package com.yf.config;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.stereotype.Component;
/**
* @projectName: springboot-security
* @package: com.yf.config
* @className: SecurityConfig
* @author: yangfeng
* @description: spring-security配置类
* @date: 2022/11/23 15:26
* @version: 1.0
*/
//将该配置类交给spring容器管理
@Component
//开启过滤器链对请求的拦截
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* @Author yangfeng
* @Description //配置认证用户信息
* //配置认证用户的权限
* @Date 15:46 2022/11/23
* @param auth:
* @return void
* authentication 认证:检查并确认身份,确定身份是否能通过系统的第一道大门
**/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("123456").authorities("addOrder","showOrder","updateOrder","deleteOrder");
auth.inMemoryAuthentication().withUser("userAdd").password("123456").authorities("showOrder","addOrder");
}
/**
* @Author yangfeng
* @Description //配置拦截请求资源
* @Date 15:46 2022/11/23
* @param http:
* @return void
* authorize:批准、许可、授权的意思,检查并确定身份是否有访问特定资源的权限
**/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/showOrder").hasAnyAuthority("showOrder")
.antMatchers("/addOrder").hasAnyAuthority("addOrder")
.antMatchers("/updateOrder").hasAnyAuthority("updateOrder")
.antMatchers("/deleteOrder").hasAnyAuthority("deleteOrder")
.antMatchers("/**").fullyAuthenticated().and().formLogin();
}
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
}
5.2.1 Kernanalyse der Authentifizierungsmethoden
5.2.2 Kernanalyse der Autorisierungsmethoden
6. Springen Sie zu einer benutzerdefinierten Seite, wenn die Berechtigungen nicht ausreichen (403)
Fügen Sie dem Projekt eine Serverparameter-Konfigurationsinformationsklasse hinzu, um Anforderungspfade für verschiedene Situationen zu definieren.
package com.yf.config;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
/**
* @Author yangfeng
* @Description // Web 服务器参数配置,可以配置默认错误页面
* @Date 14:42 2022/11/24
**/
@Configuration
public class WebServerAutoConfiguration {
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
//如果请求出现不同情况的异常状态,则转发到不同的异常处理路径
ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/error/400");
ErrorPage errorPage401 = new ErrorPage(HttpStatus.UNAUTHORIZED, "/error/401");
ErrorPage errorPage403 = new ErrorPage(HttpStatus.FORBIDDEN, "/error/403");
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error/404");
ErrorPage errorPage415 = new ErrorPage(HttpStatus.UNSUPPORTED_MEDIA_TYPE, "/error/415");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500");
factory.addErrorPages(errorPage400, errorPage401, errorPage403, errorPage404, errorPage415, errorPage500);
return factory;
}
}
Definieren Sie den Seitenpfad für die 403-Weiterleitung in ErrorController
package com.yf.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ErrorController {
// 403权限不足页面
@RequestMapping("/error/403")
public String error() {
System.out.println("403异常处理");
return "/error/403";
}
}
Wenn der Benutzer nicht über ausreichende Berechtigungen verfügt, wird auf diese Weise zur Seite /error/403 gesprungen.
7. Ersetzen Sie die integrierte Anmeldeseite des Frameworks durch eine benutzerdefinierte Anmeldeseite
Geben Sie den Pfad zur Anmeldeseite in der Ressourcenabfangmethode in der Konfigurationsklasse com.yf.config.SecurityConfig an.
Definieren Sie die endgültige weitergeleitete Seitenadresse des /login-Pfads in entsprechenden Controller< /span>
com.yf.controller.OrderController#login, im Codebeispiel dieses Abschnitts definieren wir den Login-Weiterleitungspfad in OrderController zur endgültigen Anmeldeseite
// 自定义登陆页面
@GetMapping("/login")
public String login() {
return "login";
}
8. Beurteilung von Anmeldeerfolg und Anmeldefehler
Definieren Sie die Handler-Verarbeitungsklasse für eine erfolgreiche Anmeldung im Projekt, implementieren Sie die AuthenticationSuccessHandler-Schnittstelle und handhaben Sie die Verarbeitungslogik nach erfolgreicher Anmeldung.
package com.yf.handler;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
// 认证成功
@Component
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication arg2)
throws IOException, ServletException {
System.out.println("用户认证成功");
res.sendRedirect("/");
}
}
Definieren Sie auf ähnliche Weise die Verarbeitungsklasse für den Anmeldefehler-Handler, implementieren Sie die Schnittstelle AuthenticationFailureHandler und fügen Sie der Methode für den Anmeldefehler Ihre eigene Verarbeitungslogik hinzu.
package com.yf.handler;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;
//认证失败
@Component
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {
public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse res, AuthenticationException auth)
throws IOException, ServletException {
System.out.println("登陆失败!");
res.sendRedirect("https://www.baidu.com");
}
}
Handler hinzufügen, die Anmeldeerfolg und Anmeldefehler in die Ressourcenabfangmethode der Konfigurationsklasse einfügen
Entsprechende Handler in die Ressourcenabfangmethode hinzufügen
Abgeschlossen Für Code-Referenzen gehen Sie bitte auf den Link: Github-Codebibliothek