Nennen Sie mich altmodisch, aber ich mag es nicht, riesige Frameworks wie Acegi für einfache Authentifizierungs- und Autorisierungssachen heranzuziehen. In diesem Beitrag zeige ich Ihnen, wie ich Wicket Security über JAAS mit einem LDAP verbunden habe. Dadurch werden die LDAP-Konfiguration und der Zugriff auf der Appserver-Ebene genutzt und die Anwendung bleibt sauber. Das Ganze wurde auf einem JBoss-Server durchgeführt, so dass es auf einem anderen Server anders aussieht, aber dieser Beitrag sollte Ihnen helfen, wenn Sie die Lösung anpassen müssen.
Achtung: Mit dieser Lösung sind Sie NICHT beim Appserver angemeldet, so dass Sie keine Container-Aufrufe wie isUserInRole() verwenden können. Wenn Sie herausfinden, wie das geht, lassen Sie es mich wissen. Für unsere Zwecke brauchten wir das nicht, aber es ist trotzdem gut zu wissen.
LoginPage.java ist wahrscheinlich nicht die eleganteste Art, sich bei Wicket anzumelden. Sie funktioniert, aber die Überarbeitung steht auf meiner To-Do-Liste etwas weiter unten.
Schritt eins: Einrichten des LDAP-Servers
Laden Sie OpenLDAP herunter und installieren Sie es. Sie müssen die slapd.conf ein wenig anpassen. Sie müssen das Suffix, rootdn (dieser Benutzer wird von JBoss für die Verbindung verwendet), rootpw und optional das Verzeichnis einstellen.(..snip..) ####################################################################### # ldbm Datenbank-Definitionen ####################################################################### Datenbank bdb Suffix "dc=example,dc=com" rootdn "cn=Manager,dc=example,dc=com" # Klartext-Passwörter, insbesondere für den rootdn, sollten # vermieden werden. Siehe slappasswd(8) und slapd.conf(5) für Details. # Die Verwendung einer starken Authentifizierung wird empfohlen. rootpw Geheimnis # Das Datenbankverzeichnis MUSS existieren, bevor Sie slapd ausführen UND # sollte nur für die Tools slapd und slap zugänglich sein. # Modus 700 empfohlen. Verzeichnis /my/custom/openldap/data/directory # Indizes zu pflegen index objectClass eq (..snip..)Wenn Sie OpenLDAP ausführen, kann es praktisch sein, einen höheren Port als 1024 zu verwenden (Sie brauchen keine Root-Rechte) und auf Ihre benutzerdefinierte Datei slapd.conf zu verweisen:
/pfad/zu/slapd -h "ldap://127.0.0.1:10389" -f /pfad/zu/my/custom/slapd.confSie müssen die erforderlichen Benutzer- und Gruppeneinträge im LDAP haben. Ich habe die Datei ldap-setup.ldif beigefügt, die eine Struktur aufweist, die der Konfiguration entspricht, die wir in JBoss einrichten werden.
Schritt Zwei: Verbinden Sie JBoss mit dem LDAP
JBoss verwendet das LdapLoginModule, um mit einem LDAP zu arbeiten. Sie müssen eine Anwendungsrichtlinie in der Datei login-config.xml einrichten, die sich im Verzeichnis JBOSS_HOME/server/default/conf befindet. Dadurch kann sich JBoss beim LDAP-Server anmelden und erfährt die Struktur Ihres LDAP, so dass Benutzername, Passwort und Rollen gefunden werden können. Ich habe einen Ausschnitt aus der JBoss login-config.xml beigefügt.[..snip...] [...etcetera...]Nachdem Sie dies eingerichtet haben, können Sie sich in Ihrem Code über JAAS mit dem LDAP verbinden. Die Verbindung mit Ihrer Konfiguration erfolgt über den Namen der Anwendungsrichtlinie, der an den Konstruktor LoginContext() übergeben wird (siehe später).
Schritt 3: Der JAAS Verbindungscode
Dieser Code wurde in das Wicket-Sicherheitsmodell integriert, aber er kann überall verwendet werden. Er prüft den Benutzernamen/das Kennwort und ruft die Rollen des Benutzers über JAAS ab. Ich habe die Klasse, die dies tut, angehängt und kommentiert(JAASBasedSession.java), aber im Großen und Ganzen tut sie Folgendes:- Erstellen Sie einen Handler für Rückrufe von JAAS. Dieser Handler kennt den Benutzernamen/das Kennwort.
- Erstellen Sie einen LoginContext mit dem Namen Ihrer Anwendungsrichtlinie.
- Rufen Sie login() auf, was zu Callbacks führen wird.
- Rufen Sie die Betreffinformationen ab und analysieren Sie sie, um die Rollen zu ermitteln, für die der Benutzer berechtigt ist.
- Bringen Sie die Rollen dorthin, wo Wicket sie erreichen kann.
Schritt 4: Integration mit Wicket
Das Wicket-Modell hängt von der Abfrage der Rollennamen ab, für die ein Benutzer autorisiert ist. Anstatt von WebApplication zu subclassen, subclassen Sie von AuthenticatedWebApplication. Sie haben zwei weitere Methoden zu implementieren. Die eine gibt die Klasse der Anmeldeseite zurück, die andere gibt die Klasse der AuthenticatedWebSession-Unterklasse zurück, die vom Framework verwendet werden soll. Die Unterklasse AuthenticatedWebSession ist diejenige mit dem JAAS-Konnektorcode und wird von Wicket abgefragt, um die Rollen des angemeldeten Benutzers zu ermitteln.
package com.example.myapplication.ui;
[..snip...]
import org.apache.wicket.authentication.AuthenticatedWebApplication;
import org.apache.wicket.authentication.AuthenticatedWebSession;
[..snip...]
public class MyWicketApplication extends AuthenticatedWebApplication {
[...anderes Zeug...]
@Override
protected void init() {
super.init();
[...anderes Zeug...]
// Einstellen der Seite, die Wicket anzeigt, wenn der Benutzer keine Rechte für den Zugriff auf eine Seite hat
getApplicationSettings().setAccessDeniedPage(LoginPage.class);
mountBookmarkablePage("/login", LoginPage.class);
}
protected Klasse getWebSessionClass() {
return JAASBasedSession.class;
}
protected Klasse getSignInPageClass() {
return LoginPage.class;
}
[...anderes Zeug...]
}
Die kommentierte JAASBasedSession.java ist beigefügt. Die angehängte Schritt 5: Kommentieren Sie Ihre sicheren Seiten
Wicket verfügt über Anmerkungen, die prüfen, ob der Benutzer über die für diese Seite erforderlichen Rollen verfügt. Diese Rollennamen entsprechen den Rollen, wie sie im LDAP festgelegt wurden.
package com.example.myapplication.admin.ui;
import org.apache.wicket.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.markup.html.WebPage;
// Die AuthorizeInstantiation-Anmerkung erzwingt Sicherheit auf der Grundlage der Rollen, die
// in der Sitzung festgelegt und werden mit der Methode getRoles() abgerufen. In diesem Fall sind beide
// Admin-Rollen sind berechtigt, die Seite zu verwenden. Für eine einzelne Rolle brauchen Sie die geschweiften Klammern nicht.
@AuthorizeInstantiation({"TechnicalAdmin", "FunctionalAdmin"})
public class AdministrationPage extends WebPage {
[..snip...]
}
Schritt 6: Weltherrschaft!
Jetzt sollten Sie eine vollständige Einrichtung haben. Sie können Ihre Wicket-Anwendung authentifizieren und autorisieren, während Ihre Anwendung von den Besonderheiten der LDAP-Einrichtung befreit ist. Jetzt müssen Sie nur noch Ihren Benutzern beibringen, nicht "secret" als Passwort zu verwenden... :-)Verfasst von
Serge Beaumont
Contact
Let’s discuss how we can support your journey.



