Sicherheit 25.10
Dieses Feature befindet sich in der öffentlichen Vorschau und ist bereit für den produktiven Einsatz. Während der Vorschauperiode können APIs basierend auf dem Feedback der Entwicklergemeinschaft verfeinert werden. Änderungen werden im Voraus durch Veröffentlichungsnotizen angekündigt, und Migrationsleitfäden werden bereitgestellt, wenn dies erforderlich ist.
In modernen Webanwendungen bezieht sich Sicherheit auf die Kontrolle des Zugriffs auf verschiedene Teile deiner App basierend auf der Benutzeridentität und den Berechtigungen. In webforJ bietet die Sicherheit ein Framework für die Zugriffskontrolle auf Routenebene, bei dem du Ansichten schützen, eine Authentifizierung erfordern und rollenbasierte Berechtigungen durchsetzen kannst.
The webforj-securing-apps skill can protect routes with login, role-based access, and ownership checks. After installing the webforJ AI plugin, ask your assistant:
- "Protect /admin so only users with the ADMIN role can see it."
- "Add a public landing page that anyone can visit."
- "Only let a user edit a record they own."
Traditionelles VS gesichertes Routing
Im traditionellen unsicheren Routing sind alle Routen in deiner App für jeden zugänglich, der die URL kennt. Das bedeutet, dass Benutzer zu sensiblen Seiten wie Admin-Panels oder Benutzer-Dashboards navigieren können, ohne dass eine Authentifizierung oder Autorisierungsprüfungen stattfinden. Die Verantwortung liegt bei den Entwicklern, die Berechtigungen in jeder Komponente manuell zu überprüfen, was zu inkonsistenter Durchsetzung der Sicherheit und potenziellen Schwachstellen führt.
Dieser Ansatz führt zu mehreren Problemen:
- Manuelle Überprüfungen: Entwickler müssen daran denken, in jeder geschützten Ansicht oder jedem Layout Sicherheitslogik hinzuzufügen.
- Inkonsistente Durchsetzung: Sicherheitsprüfungen, die im gesamten Code verstreut sind, führen zu Lücken und Fehlern.
- Wartungsaufwand: Änderungen der Zugriffsrichtlinien erfordern das Aktualisieren mehrerer Dateien.
- Keine zentrale Kontrolle: Es gibt keinen einzigen Ort, um die Sicherheit der App zu verstehen oder zu verwalten.
Gesichertes Routing in webforJ löst dieses Problem, indem Zugriffskontrolle direkt auf Routenebene ermöglicht wird. Das Sicherheitssystem erzwingt automatisch Regeln, bevor eine Komponente gerendert wird, was einen zentralisierten, deklarativen Ansatz zur Sicherheit der App bietet. So funktioniert es:
- Deklarative Annotations: Markiere Routen mit Sicherheitsannotations, um Zugriffsanforderungen zu definieren.
- Automatische Durchsetzung: Das Sicherheitssystem prüft die Berechtigungen, bevor eine Ansicht gerendert wird.
- Zentralisierte Konfiguration: Definiere das Sicherheitsverhalten an einem Ort und wende es konsistent an.
- Flexibele Implementierungen: Wähle zwischen der Integration von Spring Security oder einer benutzerdefinierten Implementierung in reinem Java.
Dieses Design ermöglicht Authentifizierung (Verifizierung der Identität des Benutzers) und Autorisierung (Verifizierung, auf was der Benutzer zugreifen kann), sodass nur autorisierte Benutzer Zugang zu geschützten Routen erhalten. Unautorisierte Benutzer werden automatisch umgeleitet oder der Zugang wird basierend auf den konfigurierten Sicherheitsregeln verweigert.
Beispiel für gesichertes Routing in webforJ
Hier ist ein Beispiel, das verschiedene Sicherheitslevels in einer webforJ-App zeigt:
// Öffentliche Anmeldeseite - jeder kann darauf zugreifen
@Route("/login")
@AnonymousAccess
public class LoginView extends Composite<Login> {
private final Login self = getBoundComponent();
public LoginView() {
self.onSubmit(e -> {
handleLogin(e.getUsername(), e.getPassword());
});
whenAttached().thenAccept(c -> {
self.open();
});
}
}
// Produkte - erfordert Authentifizierung
@Route(value = "/", outlet = MainLayout.class)
public class ProductsView extends Composite<FlexLayout> {
public ProductsView() {
// Produkteansicht
}
}
// Rechnungen - erfordert die ROLLE ACCOUNTANT
@Route(value = "/invoices", outlet = MainLayout.class)
@RolesAllowed("ACCOUNTANT")
public class InvoicesView extends Composite<FlexLayout> {
public InvoicesView() {
// Rechnungsansicht
}
}
In diesem Setup:
- Die
LoginViewist mit@AnonymousAccessgekennzeichnet, was unauthentifizierten Benutzern den Zugriff ermöglicht. - Die
ProductsViewhat keine Sicherheitsannotation, was bedeutet, dass sie standardmäßig eine Authentifizierung erfordert (wenn dersecure-by-default-Modus aktiviert ist). - Die
InvoicesViewerfordert die RolleACCOUNTANT, sodass nur Benutzer mit Buchhaltungsberechtigungen auf Rechnungen zugreifen können.
Wie Sicherheit funktioniert
Wenn ein Benutzer versucht, zu einer Route zu navigieren, folgt das Sicherheitssystem diesem Ablauf:
- Navigation initiiert: Benutzer klickt auf einen Link oder gibt eine URL ein.
- Sicherheitsüberprüfung: Bevor die Komponente gerendert wird, bewertet das System die Sicherheitsannotations und -regeln.
- Entscheidung: Basierend auf dem Authentifizierungsstatus und den Rollen des Benutzers:
- Gewähren: Navigation erlauben und die Komponente rendern.
- Verweigern: Navigation blockieren und zur Anmeldeseite oder zur Seite "Zugriff verweigert" umleiten.
- Rendern oder Umleiten: Entweder wird die angeforderte Komponente angezeigt, oder der Benutzer wird entsprechend umgeleitet.
Mit automatischer Durchsetzung werden Sicherheitsregeln konsistent in der gesamten App angewendet, sodass die Zugriffskontrolle behandelt wird, bevor eine Komponente gerendert wird, und Entwickler nicht manuelle Überprüfungen in jeder Ansicht hinzufügen müssen.
Authentifizierung VS Autorisierung
Um Sicherheit in deiner App korrekt zu implementieren, ist es wichtig, den Unterschied zwischen diesen beiden Konzepten zu kennen:
-
Authentifizierung: Verifizierung, wer der Benutzer ist. Dies geschieht typischerweise während der Anmeldung, wenn der Benutzer Anmeldeinformationen (Benutzername und Passwort) bereitstellt. Nach der Authentifizierung wird die Identität des Benutzers in der Sitzung oder im Sicherheitskontext gespeichert.
-
Autorisierung: Verifizierung, auf was der authentifizierte Benutzer zugreifen kann. Dabei wird überprüft, ob der Benutzer über die erforderlichen Rollen oder Berechtigungen verfügt, um auf eine bestimmte Route zuzugreifen. Die Autorisierung erfolgt jedes Mal, wenn ein Benutzer zu einer geschützten Route navigiert.
Das Sicherheitssystem von webforJ behandelt beide Aspekte:
- Annotations wie
@PermitAllbehandeln Anforderungen an die Authentifizierung. - Annotations wie
@RolesAllowedbehandeln Anforderungen an die Autorisierung.
Erste Schritte
Dieser Leitfaden geht davon aus, dass du Spring Boot mit Spring Security verwendest, was der empfohlene Ansatz für die meisten webforJ-Anwendungen ist. Spring Security bietet branchenübliche Authentifizierungs- und Autorisierungsmechanismen mit automatischer Konfiguration durch Spring Boot.
Der Rest dieser Dokumentation führt dich durch die Sicherung deiner Routen mit Spring Security, vom einfachen Setup bis zu fortgeschrittenen Funktionen. Wenn du Spring Boot nicht verwendest oder eine benutzerdefinierte Sicherheitsimplementierung benötigst, sieh dir den Sicherheitsarchitektur Leitfaden an, um zu erfahren, wie das System funktioniert und wie du benutzerdefinierte Sicherheit implementieren kannst.
Themen
Getting Started
Spring Security bietet Authentifizierung und Autorisierung für Spring Boot-Anwendungen. Wenn es mit webforJ integriert wird, schützt es Routen mithilfe von Anmerkungen, während Spring das Benutzermanagement und die Sitzungen übernimmt.
Security Annotations
Sicherheitsannotationen bieten eine deklarative Möglichkeit, den Zugriff auf Routen in Ihrer webforJ-App zu steuern. Durch das Hinzufügen von Annotationen zu Ihren Routenkomponenten definieren Sie, wer auf jede Ansicht zugreifen kann, ohne manuelle Berechtigungsprüfungen schreiben zu müssen. Das Sicherheitssystem setzt diese Regeln automatisch durch, bevor eine Komponente gerendert wird.
Accessing User
Spring Security speichert Informationen über authentifizierte Benutzer im SecurityContextHolder und bietet Zugriff auf Benutzernamen, Rollen und Berechtigungen in Ihrer gesamten App. In diesem Abschnitt wird gezeigt, wie Sie diese Informationen in webforJ-Ansichten und -Komponenten abrufen und verwenden können.
SpEL Expressions
Spring Expression Language (SpEL) bietet eine deklarative Möglichkeit, Autorisierungsregeln direkt in Annotationen zu definieren. Die Annotation @RouteAccess evaluiert SpEL-Ausdrücke unter Verwendung der integrierten Autorisierungsfunktionen von Spring Security.
Custom Evaluators
Write custom RouteSecurityEvaluators for context-aware checks like ownership verification beyond role-based permissions.
Architecture
4 Elemente
Application Security
3 Elemente