Spring Security Hello World-Anmerkungsbeispiel

Beispiel für eine Hello World-Annotation zur Frühlingssicherheit

security

In der Vorschaupost verwenden wir XML-Dateien, um die Spring Security in einer Spring MVC-Umgebung zu konfigurieren. In diesem Tutorial zeigen wir Ihnen, wie Sie das vorherige XML-basierte Spring Security-Projekt in ein reines Spring Annotation-Projekt konvertieren.

Verwendete Technologien:

  1. Feder 3.2.8.FREIGABE

  2. Federsicherheit 3.2.3.FREIGABE

  3. Eclipse 4.2

  4. JDK 1.6

  5. Maven 3

  6. Tomcat 7 (Servlet 3.x)

Einige Anmerkungen

  1. In diesem Lernprogramm wirdWebApplicationInitializer verwendet, um den Spring Context Loader automatisch zu laden. Dies wird nur im Servlet 3.x-Container unterstützt, z. B. Tomcat 7 und Jetty 8.

  2. Da wirWebApplicationInitializer verwenden, ist die Dateiweb.xml NICHT erforderlich.

  3. Spring Security-Anmerkungen werden in älteren Servlet 2.x-Containern unterstützt, z. B. in Tomcat 6. Wenn Sie die klassische XML-Datei zum Laden des Spring-Kontexts verwenden, kann dieses Lernprogramm weiterhin auf Servlet 2.x-Containern, z. B. Tomcat 6, bereitgestellt werden

1. Projekt Demo

Sehen, wie es funktioniert.

2. Verzeichnisaufbau

Überprüfen Sie die endgültige Verzeichnisstruktur dieses Lernprogramms.

spring-security-helloworld-annotation-directory

3. Spring-Sicherheitsabhängigkeiten

Um die Spring-Sicherheit zu verwenden, benötigen Siespring-security-web undspring-security-config.

pom.xml

    
        1.6
        3.2.8.RELEASE
        3.2.3.RELEASE
        1.2
    

    

        
        
            org.springframework
            spring-core
            ${spring.version}
        

        
            org.springframework
            spring-web
            ${spring.version}
        

        
            org.springframework
            spring-webmvc
            ${spring.version}
        

        
        
            org.springframework.security
            spring-security-web
            ${spring.security.version}
        

        
            org.springframework.security
            spring-security-config
            ${spring.security.version}
        

        
        
            jstl
            jstl
            ${jstl.version}
        

    

4. Spring MVC-Webanwendung

Ein einfacher Controller:

  1. Wenn URL =/welcome oder/, geben Sie die Hallo-Seite zurück.

  2. Wenn URL =/admin, wird die Administrationsseite zurückgegeben.

  3. Wenn URL =/dba, wird die Administrationsseite zurückgegeben.

Später werden wir die URLs/admin und/dbaichern.

HelloController.java

package com.example.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {

    @RequestMapping(value = { "/", "/welcome**" }, method = RequestMethod.GET)
    public ModelAndView welcomePage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is welcome page!");
        model.setViewName("hello");
        return model;

    }

    @RequestMapping(value = "/admin**", method = RequestMethod.GET)
    public ModelAndView adminPage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is protected page - Admin Page!");
        model.setViewName("admin");

        return model;

    }

    @RequestMapping(value = "/dba**", method = RequestMethod.GET)
    public ModelAndView dbaPage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is protected page - Database Page!");
        model.setViewName("admin");

        return model;

    }

}

Zwei JSP-Seiten.

hello.jsp

<%@page session="false"%>


    

Title : ${title}

Message : ${message}

admin.jsp

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page session="true"%>


    

Title : ${title}

Message : ${message}

Welcome : ${pageContext.request.userPrincipal.name} | " > Logout

5. Spring-Sicherheitskonfiguration

5.1 Erstellen Sie eine Spring Security-Konfigurationsdatei, die mit@EnableWebSecurity versehen ist

SecurityConfig.java

package com.example.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.inMemoryAuthentication().withUser("example").password("123456").roles("USER");
      auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");
      auth.inMemoryAuthentication().withUser("dba").password("123456").roles("DBA");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
        .and().formLogin();

    }
}

Das Äquivalent der Spring Security-XML-Datei:

    
        
        
    

    
      
        
        
        
        
        
      
    

5.2 Wenn Sie eine Klasse erstellen, wirdAbstractSecurityWebApplicationInitializer erweitert. DiespringSecurityFilterChain werden automatisch geladen.

SpringSecurityInitializer.java

package com.example.config.core;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
   //do nothing
}

Das Äquivalent von Spring Security in der Dateiweb.xml:

    
        springSecurityFilterChain
        org.springframework.web.filter.DelegatingFilterProxy
                
    

    
        springSecurityFilterChain
        /*
    

6. Spring MVC-Konfiguration

6.1 Eine Konfigurationsklasse, definiert die Technologie der Ansicht und importiert überSecurityConfig.java.

AppConfig.java

package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@EnableWebMvc
@Configuration
@ComponentScan({ "com.example.web.*" })
@Import({ SecurityConfig.class })
public class AppConfig {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver
                          = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

}

Das Äquivalent der Spring-XML-Datei:

    

    
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

6.2 Erstellt eineInitializer-Klasse, um alles zu laden.

SpringMvcInitializer.java

package com.example.config.core;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import com.example.config.AppConfig;

public class SpringMvcInitializer
       extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[] { AppConfig.class };
    }

    @Override
    protected Class[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

Erledigt.

Note
In der Servlet 3.x-Containerumgebung erkennt und lädt der Spring-Container dieInitializer-Klassen automatisch.

7. Demo

spring-security-helloworld-annotation-welcome

7.2 Try to access /admin page, Spring Security will intercept the request and redirect to /login, and a default login form is displayed.

spring-security-helloworld-annotation-login

7.3. Wenn Benutzername und Passwort falsch sind, werden Fehlermeldungen angezeigt und Spring leitet zu dieser URL/login?error um.

spring-security-helloworld-annotation-login-error

7.4. Wenn Benutzername und Kennwort korrekt sind, leitet Spring die Anforderung an die ursprünglich angeforderte URL weiter und zeigt die Seite an.

spring-security-helloworld-annotation-admin

7.5. Für nicht autorisierte Benutzer zeigt Spring die Seite 403 an, auf die der Zugriff verweigert wurde. Beispielsweise versuchen Benutzer "example" oder "dba", auf die URL von/adminzuzugreifen.

spring-security-helloworld-annotation-403

Quellcode herunterladen

Laden Sie es herunter -spring-security-helloworld-annotation.zip (12 KB)