2015-11-16 5 views
8

Gibt es eine Möglichkeit, die Basisauthentifizierung und die Formularanmeldung für denselben REST-Dienst einzurichten? Ich möchte eingeloggten Benutzer diesen Dienst sowohl durch Web-Browser nach dem Einloggen aktivieren und aus der Befehlszeile ausführen curl -u username:password hostname.com/api/process Jetzt habe ich diesen Beitrag gesehen: Basic and form based authentication with Spring security Javaconfig aber es ist etwas anders als das, was ich versuche zu tun. Gibt es eine Möglichkeit, dies mit Feder einzurichten? Was ich jetzt habe, ist dies:Kombinieren der Basisauthentifizierung und Formularanmeldung für die gleiche REST Api

package com.my.company.my.app.security; 

import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
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; 
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 
import org.springframework.security.crypto.password.PasswordEncoder; 
import org.springframework.security.provisioning.JdbcUserDetailsManager; 

import javax.sql.DataSource; 

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    DataSource dataSource; 

    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(SecurityConfig.class); 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
       .antMatchers("/js/**", "/css/**") 
       .permitAll(); 

     http 
       .authorizeRequests() 
       .antMatchers("/api/**") 
       .authenticated() 
       .and() 
       .httpBasic(); 

     http 
       .authorizeRequests() 
       .antMatchers("/","/index") 
       .authenticated() 
       .and() 
       .formLogin() 
       .loginPage("/login") 
       .loginProcessingUrl("/j_spring_security_check") 
       .defaultSuccessUrl("/monitor") 
       .failureUrl("/login?error") 
       .usernameParameter("j_username") 
       .passwordParameter("j_password") 
       .permitAll() 
       .and() 
       .logout() 
       .logoutUrl("/j_spring_security_logout") 
       .logoutSuccessUrl("/login?logout") 
       .permitAll() 
       .and() 
       .csrf() 
       .disable(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.jdbcAuthentication().dataSource(dataSource) 
       .passwordEncoder(passwordEncoder()) 
       .usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username=?") 
       .authoritiesByUsernameQuery("SELECT username, authority FROM authorities WHERE username=?"); 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder() { 
     PasswordEncoder encoder = new BCryptPasswordEncoder(); 
     return encoder; 
    } 
} 

Das einzige Problem ist, dass es nicht auf der Anmeldungsseite wird umgeleitet, wenn hostname.com/index oder hostname.com/ statt Fenster Pop-ups für die grundlegenden Authentifizierungsinformationen aufgerufen wird gefragt.

+0

danke für die Annahme der Antwort. Du könntest mir eine Stimme geben, wenn es dir nichts ausmacht! – SyntaX

+1

Sicher Sache. Danke für Ihre Hilfe. –

Antwort

13

Sie können dies leicht erreichen, indem Sie mehrere http Konfiguration wie unten verwenden, dieser Code erklärt nur mehrere HTTP-Konfiguration. Ich gehe davon aus, dass Sie kennen die anderen wesentlichen Konfigurationen sind im Zusammenhang Sicherheit zum Frühling zB authenticationManger usw.

@EnableWebSecurity 
    public class MultiHttpSecurityCustomConfig { 
     @Autowired 
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
      auth.inMemoryAuthentication().withUser("user").password("password").roles("USER").and().withUser("admin").password("password") 
        .roles("USER", "ADMIN"); 
     } 

     @Configuration 
     @Order(1) 
     public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { 
      protected void configure(HttpSecurity http) throws Exception { 
       http.antMatcher("/api/**").authorizeRequests().anyRequest().hasRole("ADMIN").and().httpBasic(); 
      } 
     } 

     @Configuration 
     public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { 

      @Override 
      protected void configure(HttpSecurity http) throws Exception { 
       http.authorizeRequests().anyRequest().authenticated().and().formLogin(); 
      } 


    } 
} 

Bitte beachten Federlenker Sicherheitsbeamter: Multiple HttpSecurity

Ich werde empfehlen Sie auch zu prüfen, Secure REST Services with Spring Security

Fühlen Sie sich frei zu kommentieren, wenn Sie irgendein Problem auftreten!