


Wie integriert SpringBoot SpringSecurityOauth2, um dynamische Berechtigungsprobleme für die Authentifizierung zu implementieren?
Vorbereitung
spring-boot: 2.1.4.RELEASE
spring-security-oauth3: 2.3.3.RELEASE (Wenn Sie den Quellcode verwenden möchten, ändern Sie diese Versionsnummer nicht nach Belieben, da die Schreibmethode dies ist anders als ab 2.4)
mysql: 5.7
Effektanzeige
Die Front-End-Seite wird vorerst nicht zum Andocken verwendet eine Seitenanzeige
1. Greifen Sie auf die offene Schnittstelle http://localhost:7000/open/hello zu
2. Greifen Sie auf die geschützte Schnittstelle http://localhost:7000/admin/user/info zu
3. Holen Sie sich das Token, nachdem Sie sich angemeldet haben. Nach dem Zugriff wurden die aktuell angemeldeten Benutzerinformationen erfolgreich zurückgegeben.
Implementierung: oauth3 hat insgesamt vier Modi Erklären Sie sie hier. Suchen Sie online und Sie werden dasselbe finden, da wir jetzt nur die Durchführung von Einwegtransaktionen in Betracht ziehen, sodass der Passwortmodus verwendet wird.
Es wird später einen Artikel über SpringCloud + Oauth3 geben, Gateway-Authentifizierung
Lassen Sie uns über einige Punkte sprechen
1. Dynamische Berechtigungen für die Interceptor-Konfiguration
Erstellen Sie eine neue MySecurityFilter-Klasse, erben Sie AbstractSecurityInterceptor und implementieren Sie die FilterschnittstelleInitialisierung, benutzerdefinierter Zugriffsentscheidungsmanager
@PostConstruct public void init(){ super.setAuthenticationManager(authenticationManager); super.setAccessDecisionManager(myAccessDecisionManager); }
Benutzerdefinierter Filter ruft sichere Metadatenquelle auf
@Override public SecurityMetadataSource obtainSecurityMetadataSource() { return this.mySecurityMetadataSource; }
Werfen wir zunächst einen Blick auf den Kerncode des benutzerdefinierten Filters, der sichere Metadatenquelle aufruft
Der folgende Code wird verwendet, um die Berechtigungen (Rollen) zu erhalten ) erforderlich, damit die aktuelle Anfrage eingeht
rrreeWerfen wir einen Blick auf den Kerncode des benutzerdefinierten Zugriffsentscheidungsmanagers. Dieser Code wird hauptsächlich verwendet, um den aktuell angemeldeten Benutzer zu bestimmen (die Rolle, die der aktuell angemeldete Benutzer besitzt). 2. Die benutzerdefinierte Authentifizierungsausnahme gibt ein gemeinsames Ergebnis zurück. Warum ist dies nicht erforderlich? -Ende, um den durch den Authentifizierungsfehler zurückgegebenen Inhalt zu verstehen. Er kann nicht einheitlich interpretiert werden. Schauen wir uns also ohne weiteres die Rückgabesituation ohne Konfiguration und Konfiguration an. (1) Vor der Anpassung, wenn Sie kein Token mitbringen Um auf die geschützte API-Schnittstelle zuzugreifen, sieht das zurückgegebene Ergebnis so aus
(2) Legen wir fest, dass nach der Rückkehr der Authentifizierungsschnittstelle zur Schnittstelle Folgendes angezeigt wird: Ist es für uns besser, den Benutzer zu verarbeiten und aufzufordern?
Okay, schauen wir uns an, wohin wir gehen sollen.
Unser Ressourcenserver OautyResourceConfig schreibt den folgenden Teil des Codes neu, um das von der Authentifizierungsausnahme zurückgegebene Ergebnis anzupassen. Sie können auf diesen https verweisen: //www.yisu.com/article/131668.htm
/** * 获得当前请求所需要的角色 * @param object * @return * @throws IllegalArgumentException */ @Override public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException { String requestUrl = ((FilterInvocation) object).getRequestUrl(); if (IS_CHANGE_SECURITY) { loadResourceDefine(); } if (requestUrl.indexOf("?") > -1) { requestUrl = requestUrl.substring(0, requestUrl.indexOf("?")); } UrlPathMatcher matcher = new UrlPathMatcher(); List<Object> list = new ArrayList<>(); //无需权限的,直接返回 list.add("/oauth/**"); list.add("/open/**"); if(matcher.pathsMatchesUrl(list,requestUrl)) return null; Set<String> roleNames = new HashSet(); for (Resc resc: resources) { String rescUrl = resc.getResc_url(); if (matcher.pathMatchesUrl(rescUrl, requestUrl)) { if(resc.getParent_resc_id() != null && resc.getParent_resc_id().intValue() == 1){ //默认权限的则只要登录了,无需权限匹配都可访问 roleNames = new HashSet(); break; } Map map = new HashMap(); map.put("resc_id", resc.getResc_id()); // 获取能访问该资源的所有权限(角色) List<RoleRescDTO> roles = roleRescMapper.findAll(map); for (RoleRescDTO rr : roles) roleNames.add(rr.getRole_name()); } } Set<ConfigAttribute> configAttributes = new HashSet(); for(String roleName:roleNames) configAttributes.add(new SecurityConfig(roleName)); log.debug("【所需的权限(角色)】:" + configAttributes); return configAttributes; }
3. Holen Sie sich den aktuell angemeldeten Benutzer
Noch keine Erklärung
Die zweite: Schreiben Sie einen SecurityUser, um die UserDetails-Schnittstelle zu implementieren (dieses Projekt wird in verwendet)
Die ursprüngliche UserDetails-Schnittstelle hat nur Benutzernamen und Passwort. Hier fügen wir den Benutzer in unserem System hinzu
@Override public void decide(Authentication authentication, Object o, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException { if(configAttributes == null){ //属于白名单的,不需要权限 return; } Iterator<ConfigAttribute> iterator = configAttributes.iterator(); while (iterator.hasNext()){ ConfigAttribute configAttribute = iterator.next(); String needPermission = configAttribute.getAttribute(); for (GrantedAuthority ga: authentication.getAuthorities()) { if(needPermission.equals(ga.getAuthority())){ //有权限,可访问 return; } } } throw new AccessDeniedException("没有权限访问"); }
In BaseController erbt jeder Controller dies und schreibt es in die getUser()-Methode. Solange der Benutzer ein Token für den Zugriff mitbringt, können wir die Informationen des aktuell angemeldeten Benutzers direkt abrufen
@Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources.authenticationEntryPoint(authenticationEntryPoint) //token失效或没携带token时 .accessDeniedHandler(requestAccessDeniedHandler); //权限不足时 }
protected User user; public SecurityUser(User user) { this.user = user; } public User getUser() { return user; }
Das obige ist der detaillierte Inhalt vonWie integriert SpringBoot SpringSecurityOauth2, um dynamische Berechtigungsprobleme für die Authentifizierung zu implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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



Kernelsecuritycheckfailure (Kernel-Check-Fehler) ist eine relativ häufige Art von Stoppcode. Unabhängig vom Grund führt der Bluescreen-Fehler jedoch dazu, dass viele Benutzer diese Seite sorgfältig vorstellen. 17 Lösungen für den Bluescreen „kernel_security_check_failure“ Methode 1: Entfernen Sie alle externen Geräte Wenn ein externes Gerät, das Sie verwenden, nicht mit Ihrer Windows-Version kompatibel ist, kann der Bluescreen-Fehler „Kernelsecuritycheckfailure“ auftreten. Dazu müssen Sie alle externen Geräte trennen, bevor Sie versuchen, Ihren Computer neu zu starten.

Im Jahr 2023 ist die KI-Technologie zu einem heißen Thema geworden und hat enorme Auswirkungen auf verschiedene Branchen, insbesondere im Programmierbereich. Die Bedeutung der KI-Technologie wird den Menschen zunehmend bewusst, und die Spring-Community bildet da keine Ausnahme. Mit der kontinuierlichen Weiterentwicklung der GenAI-Technologie (General Artificial Intelligence) ist es entscheidend und dringend geworden, die Erstellung von Anwendungen mit KI-Funktionen zu vereinfachen. Vor diesem Hintergrund entstand „SpringAI“ mit dem Ziel, den Prozess der Entwicklung von KI-Funktionsanwendungen zu vereinfachen, ihn einfach und intuitiv zu gestalten und unnötige Komplexität zu vermeiden. Durch „SpringAI“ können Entwickler einfacher Anwendungen mit KI-Funktionen erstellen, wodurch diese einfacher zu verwenden und zu bedienen sind.

Als Branchenführer bietet Spring+AI durch seine leistungsstarke, flexible API und erweiterte Funktionen führende Lösungen für verschiedene Branchen. In diesem Thema werden wir uns mit den Anwendungsbeispielen von Spring+AI in verschiedenen Bereichen befassen. Jeder Fall wird zeigen, wie Spring+AI spezifische Anforderungen erfüllt, Ziele erreicht und diese LESSONSLEARNED auf ein breiteres Anwendungsspektrum ausdehnt. Ich hoffe, dieses Thema kann Sie dazu inspirieren, die unendlichen Möglichkeiten von Spring+AI tiefer zu verstehen und zu nutzen. Das Spring-Framework hat eine mehr als 20-jährige Geschichte im Bereich der Softwareentwicklung, und seit der Veröffentlichung der Spring Boot 1.0-Version sind 10 Jahre vergangen. Nun kann niemand diesen Frühling bestreiten

So implementieren Sie programmgesteuerte Spring-Transaktionen: 1. Verwenden Sie TransactionCallback und TransactionCallbackWithoutResult; 4. Verwenden Sie TransactionTemplate in Kombination mit @Transactional;

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

So legen Sie die Transaktionsisolationsstufe in Spring fest: 1. Verwenden Sie die Annotation @Transactional. 3. Legen Sie sie in der Spring-Konfigurationsdatei fest. 4. Legen Sie sie in der Java-Konfigurationsklasse fest. Detaillierte Einführung: 1. Verwenden Sie die Annotation @Transactional, fügen Sie die Annotation @Transactional zu der Klasse oder Methode hinzu, die eine Transaktionsverwaltung erfordert, und legen Sie die Isolationsstufe im Attribut fest. 2. In der Spring-Konfigurationsdatei usw.

JUnit ist ein weit verbreitetes Java-Unit-Test-Framework in Spring-Projekten und kann mit den folgenden Schritten angewendet werden: JUnit-Abhängigkeit hinzufügen: org.junit.jupiterjunit-jupiter5.8.1test Testfälle schreiben: Verwenden Sie @ExtendWith(SpringExtension.class), um die Erweiterung zu aktivieren. Verwenden Sie @Autowired-Inject-Beans, verwenden Sie @BeforeEach und @AfterEach zum Vorbereiten und Bereinigen und markieren Sie Testmethoden mit @Test.

Zu den Frühlingsentwurfsmustern gehören: 1. Abhängigkeitsinjektion und Kontrollinversion; 3. Vorlagenmuster; 6. Strategiemuster und Adaptermuster; Ausführliche Einführung: 1. Abhängigkeitsinjektion und Kontrollumkehr: Diese beiden Entwurfsmuster bilden den Kern des Spring-Frameworks. Durch die Abhängigkeitsinjektion ist Spring für die Verwaltung und Injektion von Abhängigkeiten zwischen Komponenten verantwortlich, wodurch die Kopplung zwischen Komponenten verringert wird. Die Umkehrung der Kontrolle bezieht sich auf die Übergabe der Objekterstellung und des Abhängigkeitsmanagements an den Spring-Container usw.
