Exemple de sécurité Hello World avec Spring Security

Exemple d'annotation Hello World de Spring Security

security

Dans l'aperçupost, nous utilisons des fichiers XML pour configurer Spring Security dans un environnement Spring MVC. Dans ce didacticiel, nous allons vous montrer comment convertir le projet Spring Security de base XML précédent en un projet d'annotation Spring pur.

Technologies utilisées:

  1. Spring 3.2.8.RELEASE

  2. Spring Security 3.2.3.RELEASE

  3. Eclipse 4.2

  4. JDK 1.6

  5. Maven 3

  6. Tomcat 7 (Servlet 3.x)

Quelques notes

  1. Ce didacticiel utiliseWebApplicationInitializer pour charger automatiquement le Spring Context Loader, qui est uniquement pris en charge dans le conteneur Servlet 3.x, par exemple Tomcat 7 et Jetty 8.

  2. Puisque nous utilisonsWebApplicationInitializer, le fichierweb.xml n'est PAS requis.

  3. Les annotations Spring Security sont prises en charge dans les anciens conteneurs Servlet 2.x, par exemple, Tomcat 6. Si vous utilisez le fichier XML classique pour charger le contexte Spring, ce didacticiel peut toujours être déployé sur le conteneur Servlet 2.x, par exemple, Tomcat 6

1. Démo du projet

Regarde comment ça marche.

2. Structure du répertoire

Consultez la structure finale des répertoires de ce didacticiel.

spring-security-helloworld-annotation-directory

3. Dépendances de sécurité de Spring

Pour utiliser la sécurité Spring, vous avez besoin despring-security-web etspring-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. Application Web Spring MVC

Un contrôleur simple:

  1. Si URL =/welcome ou/, renvoie la page d'accueil.

  2. Si URL =/admin, renvoie la page d'administration.

  3. Si URL =/dba, renvoie la page d'administration.

Plus tard, nous sécuriserons les URL/admin et/dba.

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;

    }

}

Deux pages JSP.

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. Configuration de sécurité de printemps

5.1 Créez un fichier de configuration Spring Security, et annoté avec@EnableWebSecurity

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();

    }
}

L'équivalent du fichier xml de Spring Security:

    
        
        
    

    
      
        
        
        
        
        
      
    

5.2 Créer une classe étendAbstractSecurityWebApplicationInitializer, il chargera automatiquement lesspringSecurityFilterChain.

SpringSecurityInitializer.java

package com.example.config.core;

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

public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
   //do nothing
}

L'équivalent de Spring Security dans le fichierweb.xml:

    
        springSecurityFilterChain
        org.springframework.web.filter.DelegatingFilterProxy
                
    

    
        springSecurityFilterChain
        /*
    

6. Configuration Spring MVC

6.1 Une classe de configuration, définit la technologie de la vue et importe au-dessus deSecurityConfig.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;
    }

}

L'équivalent du fichier XML Spring:

    

    
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

6.2 Créez une classeInitializer, pour tout charger.

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[] { "/" };
    }

}

Terminé.

Note
Dans l'environnement de conteneur Servlet 3.x + le conteneur Spring détecte et charge automatiquement les classesInitializer.

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. Si le nom d'utilisateur et le mot de passe sont incorrects, des messages d'erreur seront affichés et Spring redirigera vers cette URL/login?error.

spring-security-helloworld-annotation-login-error

7.4. Si le nom d'utilisateur et le mot de passe sont corrects, Spring redirigera la demande vers l'URL d'origine demandée et affichera la page.

spring-security-helloworld-annotation-admin

7.5. Pour les utilisateurs non autorisés, Spring affichera la page 403 accès refusé. Par exemple, l'utilisateur «exemple» ou «dba» essaie d'accéder à l'URL de/admin.

spring-security-helloworld-annotation-403

Télécharger le code source

Téléchargez-le -spring-security-helloworld-annotation.zip (12 Ko)