In diesem Artikel wird die Geschichte von Spring Boot integriert, in der Spring Security integriert wird, um die Berechtigungssteuerung mithilfe von Anmerkungen zu Methoden zu implementieren und einen benutzerdefinierten Benutzerdetailservice zum Laden von Benutzerinformationen von MySQL zu verwenden. Verwenden Sie die MD5 -Verschlüsselung, die mit Sicherheit einhergeht, um das Kennwort des Benutzers zu verschlüsseln. Die Seitenvorlage verwendet die Thymeleaf -Engine.
Quellcode-Adresse: https://github.com/li5454yong/springboot-security.git
1. POM -Abhängigkeiten einführen
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.4.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </abhängig> <depeopy> <gruppe> org.springFramework <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <dependency> <gruppe> com.alibaba </Groupid> <artifactId> druid </artifactId> <version> 1.0.15 </Version> </abhängig> </abhängig>
Verwenden Sie hier Druid Connection Pooling und Feder Data JPA implementiert den Datenbankzugriff.
2. Konfigurieren Sie die Spring Security
@Configuration @enableWebmvcSecurity @enableGlobalMethodSecurity (prepostieren = true) // Sicherheitsannotation Public Class WebSecurityConfig erweitert WebSecurityConFigerAdapter {@bean @Override Protected AuthenticationManager () -Reting super.AuthenticationManager () Ausnahme {{{{Bean -super.AuthenticationManager (); } @Override Protected void configure (httpecurity http) löst eine Ausnahme aus. {// Erlauben Sie allen Benutzern, auf "/" und "/home" http.authorizeRequests () zugreifen zu können .AntMatchers ("/", "/home"). // Geben Sie die Anmeldeseite an, um "/login" .LoginPage ("/login") zu sein. .Permitall () .And () .Logout () .Logoutsuccessurl ("/home") // Die Standard -URL nach dem Abmelden ist "/home" .Permitall (); } @Autowired public void configureGlobal (AuthenticationManagerBuilder -Auth) löst Ausnahme aus {Auth .userDetailsService (CustomUserDetailsService ()) .PasswordEnCoder (passwordEncoder ()); } / *** Setzen Sie die Verschlüsselungsmethode des Benutzerkennworts auf MD5 -Verschlüsselung* @Return* / @Bean public md5passwordEnCoder passwordEncoder () {Neue MD5PasswordEncoder () zurückgeben; } / *** benutzerdefinierte userDetailsService zum Lesen von Benutzerinformationen aus der Datenbank* @return* / @Bean publicuserDetailsService CustomUserDetailsService () {neuer CustomUserDetailsService zurückgeben); }} Hier werden nur grundlegende Konfigurationen erstellt, die eine Anmeldemurl einrichten, URL, die nach dem Anmeldung springt, und eine URL, zu der nach dem Abmelden springt. Die Verwendung der Annotation @EnableGlobalMethodSecurity (preposteabled = true) kann die Annotation der Sicherheit ermöglichen. Wir können @preauThorize und @PreFilter für Methoden verwenden, die Kontrollberechtigungen erfordern.
A. Benutzerdefinierte Benutzerdetailservice
öffentliche Klasse CustomUserDetailsService implementiert UserDetailsService {@autowired // Domain Service Class Private SuserService Waitservice; @Override public userDetails loadUserByUnername (String -Benutzername) löst ustamenotFoundException aus {// Suser entspricht der Benutzertabelle in der Datenbank. Dies ist die Tabelle, die letztendlich den Benutzer und das Kennwort speichert, was angepasst werden kann // In diesem Beispiel wird das E -Mail in Suser als Benutzername: Suser -Benutzer = SuserService.FinduseryEmail verwendet. if (user == null) {werfen neuer usernamenotfoundException ("Benutzername" + Benutzername + "Nicht gefunden"); } // SecurityUser implementiert Benutzerdetails und Karten von Susers E -Mail an den Benutzernamen SecurityUser Securityuser = New SecurityUser (Benutzer); Sammlung <SimpleGrantedAuthority> Autorities = New ArrayList <SimplantedAuthority> (); Behörden. Sicherheitsprüfer zurückgeben; }}Hier müssen Sie nur die Benutzerdiener -Service -Schnittstelle implementieren, die LOADUSERBYUSERNAME -Methode neu schreiben und Benutzerinformationen aus der Datenbank abrufen. Schließlich wird eine UserDetails -Implementierungsklasse zurückgegeben.
4. Definieren Sie die Fehlerbehandlungskonfiguration
@ConfigurationPublic Class ERRORPAGECONFIG {@Bean public EmbeddedServletContainerCustomizer EmbeddedServletContainerCustomizer () {return New MyCustomizer (); } private statische Klasse MyCustomizer implementiert eingebeddedServletContainerCustomizer {@Override public void Customize (configurableembeddedServletContainer -Container) {Container.adderRorpages (Neue Fehlerpage (httpstatus.forbidden, "/403"); }}}Wenn ein Zugriffsfehler auftritt, springen Sie zu "/403".
5. Controller -Schnittstelle
@ControllerPublic Class IndexController {@Resource Private SuserService SuserService; @RequestMapping ("/home") public String home () {return "home"; } @PreeAuthorize ("HasRole ('user')") @RequestMapping (value = "/admin", method = requestMethod.get) public String toadmin () {return "Helloadmin"; } @RequestMapping ("/hello") public String hello () {return "hello"; } @RequestMapping ("/login") public String login () {return "login"; } @RequestMapping ("/") public String root () {return "index"; } @RequestMapping ("/403") public String error () {return "403"; }}@Preauthorize ("hasRole ('user')") wird für die Toadmin () -Methode verwendet, um anzuzeigen, dass Sie die Benutzerrolle haben müssen, um auf diese Methode zuzugreifen. Wenn Sie die Berechtigungsstufe steuern möchten, können Sie @preauthorize ("HaSermission ()") verwenden. Dies ist nur einer der Verwendungen. Weitere Verwendungsmethoden können die offizielle Dokumentation lesen. Es ist zu beachten, dass das Standard -Präfix der Spring Security "ROLE_" ist, das standardmäßig bei Verwendung der HasRole -Methode hinzugefügt wurde. Daher sollte unsere Benutzerrolle in der Datenbank "ROLE_USER" sein, und das Benutzerpräfix "ROLE_" wird vor dem Benutzer hinzugefügt.
6. Test
Starten Sie das Projekt und besuchen Sie http: // localhost: 1130/login
Klicken Sie, um sich anzumelden und "/Hallo" einzugeben, um einzugeben
Klicken Sie hier, um zur Administratorseite zu springen
Im Hintergrund "/admin" -RORL, das der Methode "Benutzer" entspricht, müssen Benutzer die Rolle "Benutzer" haben. Der Benutzer, der sich angemeldet hat, ist ebenfalls in der Datenbank festgelegt, um diese Rolle zu spielen.
Jetzt ändern wir die Benutzerrolle in der Datenbank und ändern sie in "rollen_admin". Nachdem Sie sich angemeldet haben, melden Sie sich erneut an, klicken Sie erneut auf die Schaltfläche "zur Administratorseite gehen" und werden zur folgenden Seite springen.
Da es jetzt keine "Benutzererlaubnis" gibt, wurde eine Ausnahme während des Zugriffs ausgelöst und sie wurde in "/403" abgefangen und umgeleitet.
7. Post -Zugriff, Fehlercode 403
Ändern Sie zunächst "/admin", um die Anfrage zu veröffentlichen
@PreauThorize ("HasRole ('user')") @RequestMapping (value = "/admin", method = requestMethod.post) public String toadmin () {return "Helloadmin"; }Ändern Sie die Anforderungsmethode der Schaltfläche "zur Administratorseite gehen". Aus dem ursprünglichen Formularausdruck können Sie die Einreichung von AJAX -Post einreichen. Wenn wir nicht mit dem Formular Post eingereicht werden, werden wir später darüber sprechen. Ändern Sie zuerst den Code
<body> <h1 th: inline = "text"> Hallo [[$ {#httpServletRequest.remoteuser}]! th: type = "surven" th: value = "Gehen Sie zur Administratorseite"/> </form>-> <a th: href = "@{/admin}" rel = "externe nofollow"> Gehen $ .ajax ({url: "/admin", Typ: 'post', Erfolg: Funktion (Daten) {}}); } </script> Klicken Sie auf die Schaltfläche "zur Administratorseite gehen" und Sie können Folgendes in der Debugging -Plattform sehen
Dies liegt daran, dass das Rahmen verhindert, dass CSRF (Cross-Site-Anforderungserwartung der Anfrage an Request-Fälschungen) auftritt und die meisten Methoden einschränken, mit Ausnahme von Get.
Hier ist eine Lösung:
Fügen Sie zunächst den folgenden Inhalt im Tag hinzu.
<meta name = "_ csrf" th: content = "$ {_ csrf.token}"/> <meta name = "_ csrf_hader" th: content = "$ {_ csrf.heaDername}"/> Solange dieses Token hinzugefügt wird, überprüft der Hintergrund die Richtigkeit dieses Tokens. Wenn es korrekt ist, akzeptiert es den Post -Zugriff.
Fügen Sie dann den folgenden Code in den Ajax -Code hinzu:
var token = $ ('meta [name = "_ csrf"]'). attr ("content"); var header = $ ('meta [name = "_ csrf_hader"]'). attr ("content"); Auf diese Weise können Sie normalerweise mit Post-, Lösch- und anderen Methoden darauf zugreifen.
Die oben genannten unter Verwendung der post -Formularmethode zum Senden. Sie können den Quellcode der Seite anzeigen.
Das Framework fügt automatisch ein verstecktes Feld in das Formularformular ein. Der Wertwert ist das Token. Verwenden des Formularsformulars, um eine Postanforderung zu senden, kann direkt übergeben werden. Wenn Sie es auf ajax -Weise senden, muss dieser Code hinzugefügt werden.
Okay, das ist alles über diesen Artikel. Später werden Artikel darüber bestehen, wie die Spring Security verwendet wird, um die Berechtigungen im Rest -API -Stil zu kontrollieren.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.