2013-12-20 9 views
10
  1. eine Login-Seite erstellenJavaConfiguration for Spring 4.0 + Sicherheit 3.2 + j_spring_security_check

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <!DOCTYPE html> 
    <html> 
        <head> 
         <meta charset="ISO-8859-1"> 
         <title>Test</title> 
         <script src="static/js/jquery-1.10.2.min.js"></script> 
         <script src="static/js/app-controller.js"></script> 
        </head> 
        <body> 
         <div>Login</div> 
         <form name="f" action="<c:url value="/j_spring_security_check"/>" method="POST"> 
          <label for="password">Username</label>&nbsp;<input type="text" id="j_username" name="j_username"><br/> 
          <label for="password">Password</label>&nbsp;<input type="password" id="j_password" name="j_password"><br/> 
          <input type="submit" value="Validate">&nbsp;<input name="reset" type="reset"> 
          <input type="hidden" id="${_csrf.parameterName}" name="${_csrf.parameterName}" value="${_csrf.token}"/> 
         </form> 
         <hr/> 
         <c:if test="${param.error != null}"> 
          <div> 
           Failed to login. 
           <c:if test="${SPRING_SECURITY_LAST_EXCEPTION != null}"> 
            Reason: <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" /> 
           </c:if> 
          </div> 
         </c:if> 
         <hr/> 
         <input type="button" value="Echo" id="echo" name="echo" onclick="AppController.echo();"> 
         <div id="echoContainer"></div> 
    
        </body> 
    </html> 
    
  2. eine WebSecurityConfigurer Deklarieren hier ist, wo ich j_username fehlte und j_password

    @Configuration 
    @EnableWebSecurity 
    @ComponentScan(basePackages = {"com.sample.init.security"}) 
    public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { 
    
        @Inject 
        private AuthenticationProvider authenticationProvider; 
    
        @Inject 
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
         auth.authenticationProvider(authenticationProvider); 
        } 
    
        @Override 
        protected void configure(HttpSecurity http) throws Exception { 
         http 
          .authorizeRequests() 
           .antMatchers(
             "/resources/**", 
             "/static/**", 
             "/j_spring_security_check", 
             "/AppController/echo.html").permitAll() 
           .anyRequest().authenticated() 
           .and() 
          .formLogin() 
           .usernameParameter("j_username") /* BY DEFAULT IS username!!! */ 
           .passwordParameter("j_password") /* BY DEFAULT IS password!!! */ 
           .loginProcessingUrl("/j_spring_security_check") 
           .loginPage("/") 
           .defaultSuccessUrl("/page") 
           .permitAll() 
           .and() 
          .logout() 
           .permitAll(); 
        } 
    
        @Override 
        public void configure(WebSecurity web) throws Exception { 
         web 
          .ignoring() 
           .antMatchers("/static/**"); 
        } 
    
    } 
    
  3. Declare ein WebMvcConfigurer

    @EnableWebMvc 
    @Configuration 
    @ComponentScan(basePackages = { 
         "com.app.controller",   
         "com.app.service", 
         "com.app.dao" 
    }) 
    public class WebMvcConfigurer extends WebMvcConfigurerAdapter { 
    
        @Bean 
        public ViewResolver viewResolver() { 
         InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
         viewResolver.setPrefix("/WEB-INF/view/"); 
         viewResolver.setSuffix(".jsp"); 
         return viewResolver; 
        } 
    
        @Override 
        public void addViewControllers(ViewControllerRegistry registry) { 
         registry.addViewController("/page").setViewName("page"); 
        } 
    
        @Override 
        public void addResourceHandlers(ResourceHandlerRegistry registry) { 
         registry.addResourceHandler("static/**").addResourceLocations("static/"); 
        } 
    
    } 
    
  4. Deklarieren Sie eine Sicherheits Initializer

    public class SecurityWebAppInitializer 
        extends AbstractSecurityWebApplicationInitializer { } 
    
  5. eine App Initialzer Deklarieren

    public class Initializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
    
        @Override 
        protected Class<?>[] getRootConfigClasses() {  
         return new Class<?>[]{WebSecurityConfigurer.class}; 
        } 
    
        @Override 
        protected Class<?>[] getServletConfigClasses() { 
         return new Class<?>[]{WebMvcConfigurer.class, DataSourceConfigurer.class}; 
        } 
    
        @Override 
        protected String[] getServletMappings() { 
         return new String[]{"/"}; 
        } 
    
    } 
    
  6. Implementieren Sie Ihre benutzerdefinierten Authentifizierungsanbieter

    @Component 
    @ComponentScan(basePackages = {"com.app.service"}) 
    public class CustomAuthenticationProvider implements AuthenticationProvider { 
    
        private static final Logger LOG = LoggerFactory.getLogger(CustomAuthenticationProvider.class); 
    
        @Inject 
        private AppService service; 
    
        @Override 
        public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
    
         //Thread.dumpStack(); 
         String username = authentication.getName(); 
         String password = authentication.getCredentials().toString(); 
    
         String message = String.format("Username: '%s' Password: '%s'", username, password); 
         UserBean userBean = service.validate(username, password);  
         LOG.debug(message); 
         if (userBean != null) { 
          List<GrantedAuthority> grantedAuths = new ArrayList<>(); 
          grantedAuths.add(new SimpleGrantedAuthority("USER")); 
          return new UsernamePasswordAuthenticationToken(userBean, authentication, grantedAuths); 
         } else { 
          String error = String.format("Invalid credentials [%s]", message); 
          throw new BadCredentialsException(error); 
         } 
        } 
    
        @Override 
        public boolean supports(Class<?> authentication) { 
         return authentication.equals(UsernamePasswordAuthenticationToken.class); 
        } 
    
    } 
    

Ich überspringe EchoController, AppService, AppDao und UserBean.

Danke.

+0

@zeh: Was macht Ihren Authentifizierungsparameter sieht aus wie auf Verfahren authentifizieren? Was sind seine Eigenschaftenwerte? – vincentks

+0

@vincentks Beide Anmeldeinformationen und Prinzipal sind leer. Beim Einchecken der Firebug-Netzwerkkonsole werden beide Parameter gesendet. Es sieht so aus, als wären sie irgendwann verloren. Da ich die neuen Spring-Funktionen (Java-Konfiguration) verwende, sucht die Spring-Sicherheit möglicherweise nach einem anderen Parameterpaar (nicht nach j_username oder j_password), rate ich. – zeh

+0

Ich habe gerade einen Controller hinzugefügt, der die Validierung mit einer Echo-Methode umgeht, Benutzername und Passwort, und sie sind auch leer mit @RequestParam – zeh

Antwort

20

In Version 3.2 haben sich die Post-Parameter von j_username in Benutzername und j_password in Passwort geändert. Die Login-URL wurde ebenfalls von/j_spring_security_check in/login geändert.

Siehe diesen Link für die Erklärung, warum diese Änderung implementiert wurde: http://docs.spring.io/spring-security/site/docs/3.2.0.RELEASE/reference/htmlsingle/#jc-httpsecurity. Dies sind die Änderungen:

  • GET/login macht die Login-Seite statt/spring_security_login

  • POST/login authentifiziert den Benutzer statt/j_spring_security_check

  • den Benutzernamen Parameter standardmäßig auf Benutzernamen statt von j_Benutzername

  • Der Passwortparameter lautet standardmäßig password anstelle von j_password

Und dies für ein Beispiel eines Login-Formular: http://docs.spring.io/spring-security/site/docs/3.2.0.RELEASE/reference/htmlsingle/#jc-form

+0

ich benutze 3.2-RC2 und j_username und j_password arbeiten noch ... haben sie sich geändert und URL-Name von RC2? –

+1

@pasemes In der Tat! Ich bin gerade hergekommen, um den Code zu aktualisieren. Ich habe das hier gefunden http://docs.spring.io/spring-security/site/docs/3.2.x/apidocs/org/springframework/sicherheit/config/annotation/web/builders/HttpSecurity.html Aber wie Sie bereits erwähnt haben, zeigen Sie für Sie, danke. – zeh

Verwandte Themen