Vor kurzem habe ich an einem App -Projekt gearbeitet. Ich habe es allein im Hintergrund entwickelt. Die grundlegenden Funktionen von Anmeldung, Registrierung und Berechtigungsüberprüfung wurden in der ersten Entwicklungsstufe in der Reihenfolge der Entwicklungsaufgaben nicht enthalten. Jetzt wurden einige geschäftsbezogene Funktionen erfüllt, das Benutzerportal wurde jedoch noch nicht implementiert. Dies zeigt nur, dass ich zu ängstlich war, als ich die Anforderungen zum ersten Mal analysierte und das grundlegendste Benutzerportal zurückgelegt habe.
Jetzt müssen Sie anhand des vorhandenen Codes anmeldeten und die Bestimmungsfunktionen für die Überprüfung der Berechtigung hinzufügen.
In Bezug auf die Anmeldungs- und Berechtigungsüberprüfung, in Bezug auf frühere Erfahrung in der iOS -Entwicklung bietet die App -Seite Benutzername und Passwort für den Austausch gegen Token. Für jede Anfrage ist für jede Anfrage über das ausgetauschte Token eine Anmeldung erforderlich.
Andererseits muss ich nun die folgenden Probleme berücksichtigen:
1. Wie man die Implementierung dieser Funktionen im Code der vorhandenen Funktionen leicht erfüllt, damit der vorhandene Code nicht viel geändert wird, und es wird keinen Aufwand für die Umsetzung der Berechtigungsüberprüfung in der Zukunft geben.
2. So generieren Sie Token basierend auf Benutzername und Passwort und wie Sie die Richtigkeit des Kunden unterscheiden, die Token in Funktionen zur Verfügung stellen, die Berechtigungen erfordern
Erstens ist die herkömmliche Lösung Filter und Interceptors. Wenn die Anmeldungs- und Berechtigungsüberprüfung in die Anforderungenanordnung aufgenommen wird, sofern die URLs der späteren Funktionen ein bestimmtes Muster erhalten, ist die Verwendung von Filtern oder Abfangwäschen erfolgreich. Aber jetzt stehe ich vor URLs, die im frühen Stadium weder Design noch Spezifikationen haben, daher möchte ich nicht mit Filtern oder Abfanggeräten gegenüberstehen.
Zusätzlich zu den oben genannten herkömmlichen Lösungen ist Frühlings -AOP zu einer Waffe geworden, um diese Art von Problem zu lösen. Es wird mit der Gesichtsförderung programmiert, um eine Vorabbeziehung für alle Methoden bereitzustellen, die eine Berechtigungsüberprüfung erfordern. Da die URL, der Klassenname oder die Methode nicht regelmäßig sind, habe ich an eine benutzerdefinierte Annotation nachgedacht und die Berechtigungen für alle Methoden verifizieren, die benutzerdefinierte Anmerkungen hinzufügen.
1. Da Sie bereits über die Verwendung von Spring AOP gedacht haben, besteht der erste Schritt darin, AOP in der Federkonfigurationsdatei zu aktivieren
// AOP öffnen
<AOP: Aspektj-Autoproxy />
Die obige Konfiguration basiert auf dem Gießen von Spring-AOP-bezogenen JAR-Paketen in das Projekt und die Einführung der URL von AOP im Konfigurationsdateiheader.
2. Als nächstes definieren wir zuerst eine benutzerdefinierte Annotation
@Target ({Elementtype.method, elementtype.type}) @retention (retentionpolicy.runtime) public @Interface userAccess {}3. Wir können uns nicht beeilen, die Funktionen für die Erlaubnis zu vermitteln, da unser Token noch keine Lösung generiert hat.
In der richtigen Token-Generation wird ein einzelnes Sign-On berücksichtigt, sodass Token nicht ständig repariert werden können. Andernfalls können Sie zu jeder Zeit, solange Sie ein Token haben, dasselbe Konto mindestens zwei Personen gleichzeitig verwenden, was derzeit in unserem Geschäft nicht zulässig ist. Am Ende habe ich "Benutzername + Passwort + Anmeldezeit" ausgewählt, um die MD5 -Verschlüsselung als Token durchzuführen (es gibt viele Methoden, wie beispielsweise UUID, um Einzigartigkeit und Veränderlichkeit zu gewährleisten). Generieren Sie Token, wenn der Benutzername und das Passwort erfolgreich überprüft werden, und speichern Sie das Token in Form von Schlüsselwertpaaren von "Benutzername: Token" und "Token: Benutzer" (können auch in die Datenbank gespeichert werden) und geben schließlich den Token an den Kunden zurück.
Der folgende Code ist nur ein einfaches Beispiel:
@ServicePublic Class LoginService {/*** Store "Benutzername: Token" Schlüsselwertpaar*/public static map <String, String> tokenmap = new Hashmap <String> ();/*** Store "Token: Benutzer" Schlüsselvalue-PAIL/public static map <string, usermap, loginusmap = new Hadermap, usw.) (). public string login (String-Name, String-Kennwort) {System.out.println (Name+"------"+Passwort);/*** Überprüfen Sie, ob der Anmeldung erfolgreich ist* 1. Login erfolgreich* 1.1. Generieren Sie erfolgreich das entsprechende Token und Update * 1.2. Wirf eine Ausnahme, wenn sie fehlschlägt*/String token = tokenmap.get (name); user user = null; if (token == null) {user = new user (); user.setName (name); user.setPassword (Passwort); System.out.println ("New Benutzer login ");} else {user = loginusermap.get (Token); loginusermap.remove (Token); System.out.println (" User User Login Token ");} Token = Md5util.md5 (Name+Passwort+New Date (). token);4. Gleichzeitig hat unser Kunde ein Token erhalten, nachdem wir uns angemeldet haben. Solange wir das Token in allen Anfragen tragen, die die Erlaubnis erfordern, können wir die Antwort erfolgreich erhalten (Vorschlag: Um die App -Codierung zu erleichtern, können wir in der Zukunft keine wichtigen Änderungen anwenden, und wir müssen in der Zukunft keine wesentlichen Änderungen betrachten. Ich habe gerade eine Methode gefunden, um ein Experiment durchzuführen:
@Controller@RequestMapping ("/login") öffentliche Klasse Logincontroller {@autowiredPrivate LoginService LoginService; @UserAccess @requestMapping (value = "/loginin", method = requestMethod.get) public @RespondenBody String Login (httpServletRequest Request) {String name = request.getParameter ("Name"); String -Passwort = Anfrage.GetParameter ("Passwort"); String token = logins.Beachten Sie, dass der mutige Teil darin besteht, die Annotation anzupassen. Es ist unmöglich, Token für die Anforderungsparameter der Anmeldungsfunktion zu haben. Unabhängig davon, wie oft es überprüft wird, kann sie nicht übergeben werden. Machen Sie einfach ein Beispiel. @UserAccess Hinzufügen nur Arbeiten für die Funktionalität, die eine Berechtigungsüberprüfung erfordert
5. benutzerdefinierte Annotation ist jetzt ein guter Einstiegspunkt
@Component@Aspektpublic Class Permissionaspect {// Setzen Sie die benutzerdefinierte Annotation als Einstiegspunkt @before ("@Annotation (com.example.chap01.Annotation.UserAccess)) public void CheckPermission (joinpoint joinpoint) Throws Exception {system.println (" Pre-Notification "). JoinPoint.getargs (); user = loginService.loginusmap.get (Token); if (user == null) {System.out.println ("Überprüfung wird nicht übergeben!");Zu diesem Zeitpunkt sind die Anmeldungs- und Berechtigungsüberprüfungsfunktionen abgeschlossen.
Darüber hinaus ist der Quellcode auf persönlichem GitHub beigefügt: https://github.com/zw201913/appllogin.git
Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.