Erfahren Sie Schritt für Schritt, wie Sie mit der Federsicherheit beginnen

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

Fügen Sie hier eine Bildbeschreibung ein

5.2.2 Kernanalyse der Autorisierungsmethoden

Fügen Sie hier eine Bildbeschreibung ein

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.
Fügen Sie hier eine Bildbeschreibung ein
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
Fügen Sie hier eine Bildbeschreibung ein
Entsprechende Handler in die Ressourcenabfangmethode hinzufügen
Fügen Sie hier eine Bildbeschreibung ein
Abgeschlossen Für Code-Referenzen gehen Sie bitte auf den Link: Github-Codebibliothek

Acho que você gosta

Origin blog.csdn.net/yangfenggh/article/details/128007641
Recomendado
Clasificación