Wie Springboot die universelle Auth-Authentifizierung implementiert
Traditionelles AOP
Für diese Anforderung fällt mir natürlich als Erstes die von Spring-Boot bereitgestellte AOP-Schnittstelle ein. Sie müssen nur einen Pointcut vor der Controller-Methode hinzufügen und dann den Pointcut verarbeiten.
Implementierung
Die Schritte sind wie folgt:
Verwenden Sie @Aspect, um die Aspektklasse WhitelistAspect zu deklarieren;
Fügen Sie einen Schnittpunkt WhitelistPointcut() in der Aspektklasse hinzu Punkt, es ist flexibel und kann zusammengestellt werden. Anstatt hier alle Ausführungen abzufangen, fügen Sie eine Annotation @Whitelist hinzu, und nur die annotierte Methode überprüft die Whitelist.
Verwenden Sie die AOP-Annotation @Before von Spring in der Aspektklasse, um eine Benachrichtigungsmethode checkWhitelist() zu deklarieren, um die Whitelist zu überprüfen, bevor die Controller-Methode ausgeführt wird.
Der Pseudocode der Aspektklasse lautet wie folgt:
@Aspect public class WhitelistAspect { @Before(value = "whitelistPointcut() && @annotation(whitelist)") public void checkAppkeyWhitelist(JoinPoint joinPoint, Whitelist whitelist) { checkWhitelist(); // 可使用 joinPoint.getArgs() 获取Controller方法的参数 // 可以使用 whitelist 变量获取注解参数 } @Pointcut("@annotation(com.zhenbianshu.Whitelist)") public void whitelistPointCut() { } }
Fügen Sie die @Whitelist-Annotation zur Controller-Methode hinzu, um die Funktion zu implementieren.
Erweiterung
In diesem Beispiel werden Annotationen zum Deklarieren von Pointcuts verwendet, und ich habe Annotationsparameter implementiert, um die zu überprüfende Whitelist zu deklarieren. Wenn später andere Whitelists hinzugefügt werden müssen, z. B. die Überprüfung über UID, können Sie Methoden wie hinzufügen als uid() zu dieser Annotation hinzufügen, um eine benutzerdefinierte Überprüfung zu implementieren.
Darüber hinaus unterstützt das AOP von Spring auch die Ausführung (Ausführungsmethode), Bean (Ausführungsmethode eines Bean-Objekts, das einem bestimmten Namen entspricht) und andere Pointcut-Deklarationsmethoden sowie @Around (wird bei der Ausführung der Zielfunktion ausgeführt), @After ( Methodenausführung (nachher) und andere Benachrichtigungsmethoden.
Die Funktion wurde also implementiert, aber der Leiter ist nicht zufrieden =_= Der Grund dafür ist, dass AOP im Projekt zu häufig verwendet und missbraucht wurde. Nun, ich musste einfach damit anfangen. Beachten Sie auch: Ma Yuan Technology Column, Antwort im Hintergrund: „Interview Guide“ ist erhältlich, die neueste Version von hochauflösenden PDF-Interviewfragen mit 3625 Seiten für große Internetunternehmen.
Interceptor
Springs Interceptor eignet sich auch sehr gut zur Implementierung dieser Funktion. Wie der Name schon sagt, wird der Interceptor verwendet, um über einige Parameter zu bestimmen, ob diese Methode ausgeführt werden soll, bevor die Aktion im Controller ausgeführt wird. Um einen Interceptor zu implementieren, können Sie die HandlerInterceptor-Schnittstelle von Spring implementieren.
Implementierung
Die Implementierungsschritte lauten wie folgt:
Definieren Sie die Interceptor-Klasse AppkeyInterceptor und implementieren Sie die HandlerInterceptor-Schnittstelle.
Implementieren Sie die preHandle-Methode.
Verwenden Sie Anmerkungen und Parameter in der preHandle-Methode, um zu bestimmen, ob die Anforderung abgefangen werden muss.
Registrieren Sie dieses Abfangen In der benutzerdefinierten WebMvcConfigurerAdapter-Klasse lautet die
AppkeyInterceptor-Klasse wie folgt:
@Component public class WhitelistInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Whitelist whitelist = ((HandlerMethod) handler).getMethodAnnotation(Whitelist.class); // whitelist.values(); 通过 request 获取请求参数,通过 whitelist 变量获取注解参数 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 方法在Controller方法执行结束后执行 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在view视图渲染完成后执行 } }
Extension
Um den Interceptor zu aktivieren, müssen Sie ihn auch explizit konfigurieren. Hier verwenden wir WebMvcConfigurerAdapter, um ihn zu konfigurieren. Es ist zu beachten, dass sich die MvcConfiguration, die sie erbt, im ComponentScan-Pfad befinden muss.
@Configuration public class MvcConfiguration extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new WhitelistInterceptor()).addPathPatterns("/*").order(1); // 这里可以配置拦截器启用的 path 的顺序,在有多个拦截器存在时,任一拦截器返回 false 都会使后续的请求方法不再执行 } }
Beachten Sie außerdem, dass nach erfolgreicher Ausführung des Interceptors der Antwortcode 200 lautet, die Antwortdaten jedoch leer sind.
Nachdem der Anführer den Interceptor verwendet hat, hat er sich schließlich einen großen Schritt ausgedacht: Wir haben bereits einen Auth-Parameter. Wir können Whitelisting als Methode für Auth verwenden ? Zeitüberprüfung? Emmm... Blut erbrechen.
ArgumentResolver
Der Parameter-Parser ist ein von Spring bereitgestelltes Tool zum Parsen benutzerdefinierter Parameter. Mit ihm können wir die Parameter in unserer gewünschten Weise kombinieren Es. Spring verwaltet eine ResolverList. Wenn die Anforderung eintrifft, stellt Spring fest, dass benutzerdefinierte Typparameter (nicht grundlegende Typen) vorhanden sind, und testet diese Resolver nacheinander, bis ein Resolver die erforderlichen Parameter analysieren kann. Um einen Parameter-Resolver zu implementieren, müssen Sie die HandlerMethodArgumentResolver-Schnittstelle implementieren.
Implementierung
Definieren Sie den benutzerdefinierten Parametertyp AuthParam, und es gibt appkey-bezogene Felder in der Klasse;
Definieren Sie AuthParamResolver und implementieren Sie die Schnittstelle „HandlerMethodArgumentResolver“. kombinieren AuthParam mit AuthParamResolver passt sich an ;
Implementieren Sie die Schnittstellenmethode „resolveArgument()“, um das Anforderungsobjekt zu analysieren, um ein AuthParam-Objekt zu generieren, und überprüfen Sie hier AuthParam, um zu bestätigen, ob sich der Appkey in der Whitelist befindet;
Fügen Sie den AuthParam-Parameter hinzu in der Signatur der Controller-Aktionsmethode, um diesen Resolver zu aktivieren es im WebMvcConfigurerAdapter:
- Dieses Mal ist die Implementierung abgeschlossen, ich habe immer noch einige Bedenken, also habe ich online gesucht, ob es andere Möglichkeiten gibt, diese Funktion zu erreichen, und festgestellt, dass Filter auch häufig vorkommt.
Filter
Filter 并不是 Spring 提供的,它是在 Servlet 规范中定义的,是 Servlet 容器支持的。被 Filter 过滤的请求,不会派发到 Spring 容器中。它的实现也比较简单,实现 javax.servlet.Filter接口即可。
由于不在 Spring 容器中,Filter 获取不到 Spring 容器的资源,只能使用原生 Java 的 ServletRequest 和 ServletResponse 来获取请求参数。
另外,在一个 Filter 中要显示调用 FilterChain 的 doFilter 方法,不然认为请求被拦截。实现类似:
public class WhitelistFilter implements javax.servlet.Filter {@Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化后被调用一次 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 判断是否需要拦截 chain.doFilter(request, response); // 请求通过要显示调用 } @Override public void destroy() { // 被销毁时调用一次 } }
Nach dem Login kopieren扩展
Filter 也需要显示配置:
@Configuration public class FilterConfiguration { @Bean public FilterRegistrationBean someFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new WhitelistFilter()); registration.addUrlPatterns("/*"); registration.setName("whitelistFilter"); registration.setOrder(1); // 设置过滤器被调用的顺序 return registration; } }
Nach dem Login kopierenDas obige ist der detaillierte Inhalt vonWie Springboot die universelle Auth-Authentifizierung implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
@Component public class AuthParamResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().equals(AuthParam.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { Whitelist whitelist = parameter.getMethodAnnotation(Whitelist.class); // 通过 webRequest 和 whitelist 校验白名单 return new AuthParam(); } }

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Einführung in Jasypt Jasypt ist eine Java-Bibliothek, die es einem Entwickler ermöglicht, seinem Projekt mit minimalem Aufwand grundlegende Verschlüsselungsfunktionen hinzuzufügen und kein tiefes Verständnis der Funktionsweise der Verschlüsselung erfordert. standardbasierte Verschlüsselungstechnologie. Passwörter, Text, Zahlen, Binärdateien verschlüsseln ... Geeignet für die Integration in Spring-basierte Anwendungen, offene API, zur Verwendung mit jedem JCE-Anbieter ... Fügen Sie die folgende Abhängigkeit hinzu: com.github.ulisesbocchiojasypt-spring-boot-starter2 Die Vorteile von Jasypt schützen unsere Systemsicherheit. Selbst wenn der Code durchgesickert ist, kann die Datenquelle garantiert werden.

Nutzungsszenario 1. Die Bestellung wurde erfolgreich aufgegeben, die Zahlung erfolgte jedoch nicht innerhalb von 30 Minuten. Die Zahlung ist abgelaufen und die Bestellung wurde automatisch storniert. 2. Die Bestellung wurde unterzeichnet und es wurde 7 Tage lang keine Bewertung durchgeführt. Wenn die Bestellung abläuft und nicht ausgewertet wird, wird die Bestellung standardmäßig positiv bewertet. Wenn der Händler die Bestellung innerhalb von 5 Minuten nicht erhält, wird die Bestellung abgebrochen Es wird eine SMS-Erinnerung gesendet ... Für Szenarien mit langen Verzögerungen und geringer Echtzeitleistung können wir die Aufgabenplanung verwenden, um eine regelmäßige Abfrageverarbeitung durchzuführen. Zum Beispiel: xxl-job Heute werden wir auswählen

1. Redis implementiert das Prinzip der verteilten Sperren und warum verteilte Sperren erforderlich sind. Bevor über verteilte Sperren gesprochen wird, muss erläutert werden, warum verteilte Sperren erforderlich sind. Das Gegenteil von verteilten Sperren sind eigenständige Sperren. Wenn wir Multithread-Programme schreiben, vermeiden wir Datenprobleme, die durch den gleichzeitigen Betrieb einer gemeinsam genutzten Variablen verursacht werden. Normalerweise verwenden wir eine Sperre, um die Richtigkeit der gemeinsam genutzten Variablen sicherzustellen Die gemeinsam genutzten Variablen liegen im gleichen Prozess. Wenn es mehrere Prozesse gibt, die gleichzeitig eine gemeinsam genutzte Ressource betreiben müssen, wie können sie sich dann gegenseitig ausschließen? Heutige Geschäftsanwendungen sind in der Regel Microservice-Architekturen, was auch bedeutet, dass eine Anwendung mehrere Prozesse bereitstellen muss. Wenn mehrere Prozesse dieselbe Datensatzzeile in MySQL ändern müssen, ist eine Verteilung erforderlich, um fehlerhafte Daten zu vermeiden wird zu diesem Zeitpunkt eingeführt. Der Stil ist gesperrt. Punkte erreichen wollen

Springboot liest die Datei, kann aber nach dem Packen in ein JAR-Paket nicht auf die neueste Entwicklung zugreifen. Es gibt eine Situation, in der Springboot die Datei nach dem Packen in ein JAR-Paket nicht lesen kann ist ungültig und kann nur über den Stream gelesen werden. Die Datei befindet sich unter resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

SpringBoot und SpringMVC sind beide häufig verwendete Frameworks in der Java-Entwicklung, es gibt jedoch einige offensichtliche Unterschiede zwischen ihnen. In diesem Artikel werden die Funktionen und Verwendungsmöglichkeiten dieser beiden Frameworks untersucht und ihre Unterschiede verglichen. Lassen Sie uns zunächst etwas über SpringBoot lernen. SpringBoot wurde vom Pivotal-Team entwickelt, um die Erstellung und Bereitstellung von Anwendungen auf Basis des Spring-Frameworks zu vereinfachen. Es bietet eine schnelle und einfache Möglichkeit, eigenständige, ausführbare Dateien zu erstellen

Wenn Springboot + Mybatis-plus keine SQL-Anweisungen zum Hinzufügen mehrerer Tabellen verwendet, werden die Probleme, auf die ich gestoßen bin, durch die Simulation des Denkens in der Testumgebung zerlegt: Erstellen Sie ein BrandDTO-Objekt mit Parametern, um die Übergabe von Parametern an den Hintergrund zu simulieren dass es äußerst schwierig ist, Multi-Table-Operationen in Mybatis-plus durchzuführen. Wenn Sie keine Tools wie Mybatis-plus-join verwenden, können Sie nur die entsprechende Mapper.xml-Datei konfigurieren und die stinkende und lange ResultMap konfigurieren Schreiben Sie die entsprechende SQL-Anweisung. Obwohl diese Methode umständlich erscheint, ist sie äußerst flexibel und ermöglicht es uns

1. Passen Sie den RedisTemplate1.1-Standard-Serialisierungsmechanismus an. Die API-basierte Redis-Cache-Implementierung verwendet die RedisTemplate-Vorlage für Daten-Caching-Vorgänge. Öffnen Sie hier die RedisTemplate-Klasse und zeigen Sie die Quellcodeinformationen der Klasse publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations an. Schlüssel deklarieren, verschiedene Serialisierungsmethoden des Werts, der Anfangswert ist leer @NullableprivateRedisSe

In Projekten werden häufig einige Konfigurationsinformationen benötigt. Diese Informationen können in der Testumgebung und in der Produktionsumgebung unterschiedliche Konfigurationen haben und müssen möglicherweise später basierend auf den tatsächlichen Geschäftsbedingungen geändert werden. Wir können diese Konfigurationen nicht fest im Code codieren. Am besten schreiben Sie sie in die Konfigurationsdatei. Sie können diese Informationen beispielsweise in die Datei application.yml schreiben. Wie erhält oder verwendet man diese Adresse im Code? Es gibt 2 Methoden. Methode 1: Wir können den Wert, der dem Schlüssel in der Konfigurationsdatei (application.yml) entspricht, über den mit @Value versehenen Wert erhalten. Diese Methode eignet sich für Situationen, in denen es relativ wenige Mikrodienste gibt: Tatsächlich Projekte, wenn das Geschäft kompliziert ist, Logik
