2015-09-13 24 views
50

So che proteggere l'API REST è un argomento ampiamente commentato, ma non sono in grado di creare un piccolo prototipo che soddisfi i miei criteri (e devo confermare che questi criteri sono realistici). Ci sono così tante opzioni su come proteggere le risorse e su come lavorare con la sicurezza di Spring, ho bisogno di chiarire se le mie esigenze sono realistiche.Come proteggere l'API REST con Spring Boot e Spring Security?

miei requisiti

  • Token di autenticazione basato - gli utenti forniranno le sue credenziali e ottenere token univoco e tempo di accesso limitato. Vorrei gestire la creazione di token, verificarne la validità, la scadenza nella mia implementazione.
  • Alcune risorse resto sarà pubblica - non c'è bisogno di autenticare a tutti,
  • Alcune risorse saranno accessibili solo per gli utenti con diritti di amministratore,
  • Other resource sarà accessibile dopo l'autorizzazione per tutti gli utenti.
  • Non voglio utilizzare l'autenticazione di base
  • configurazione codice Java (non XML)

Stato attuale

mio API REST funziona molto bene, ma ora ho bisogno di fissarlo . Quando ero alla ricerca di una soluzione che ho creato un filtro javax.servlet.Filter:

@Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) req; 

     String accessToken = request.getHeader(AUTHORIZATION_TOKEN); 
     Account account = accountDao.find(accessToken); 

     if (account == null) {  
      throw new UnauthorizedException();  
     } 

     chain.doFilter(req, res); 

    } 

Ma questa soluzione con javax.servlet.filters non funziona come ho bisogno perché c'è un problema con la gestione delle eccezioni tramite @ControllerAdvice con la Primavera servlet dispatcher.

Che cosa ho bisogno

Vorrei sapere se questi criteri sono realistici e ottenere alcun aiuto, come avviare il fissaggio REST API con Primavera di sicurezza. Ho letto molti tutorial (ad esempio Spring Data REST + Spring Security) ma tutti funzionano in configurazione di base: gli utenti con le loro credenziali sono archiviati nella memoria nella configurazione e ho bisogno di lavorare con DBMS e creare il proprio autenticatore.

Per favore dammi alcune idee su come iniziare.

risposta

36

token di autenticazione basato - gli utenti forniranno le sue credenziali e ottenere unico e tempo di token di accesso limitato. Vorrei gestire la creazione del token , verificando la validità, la scadenza nella mia implementazione.

In realtà, l'uso del filtro per token di autenticazione - modo migliore, in questo caso

Alla fine, è possibile creare CRUD tramite dati Primavera per la gestione delle proprietà del token piace per scadere, etc.

Ecco il mio filtro token: http://pastebin.com/13WWpLq2

e Token Servizio Attuazione

http://pastebin.com/dUYM555E

Alcune risorse resto sarà pubblica - non c'è bisogno di autenticarsi a tutti

Non è un problema, puoi gestire le tue risorse v ia config sicurezza primavera come questo: .antMatchers("/rest/blabla/**").permitAll()

Alcune risorse saranno accessibili solo per gli utenti con diritti di amministratore,

Date un'occhiata al @Secured annotazione di classe. Esempio:

@Controller 
@RequestMapping(value = "/adminservice") 
@Secured("ROLE_ADMIN") 
public class AdminServiceController { 

L'altra risorsa sarà accessibile dopo l'autorizzazione per tutti gli utenti.

Torna configurare Primavera di sicurezza, è possibile configurare l'URL come questo:

http 
      .authorizeRequests() 
      .antMatchers("/openforall/**").permitAll() 
      .antMatchers("/alsoopen/**").permitAll() 
      .anyRequest().authenticated() 

non voglio utilizzare l'autenticazione di base

Sì, attraverso il filtro di token, i tuoi utenti saranno autenticati.

configurazione codice Java (non XML)

Torna alle parole di cui sopra, guardare @EnableWebSecurity. La classe sarà:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {} 

Devi eseguire l'override del metodo configure. Codice di seguito, solo per esempio, come configurare i matcher. Viene da un altro progetto.

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
      .antMatchers("/assets/**").permitAll() 
      .anyRequest().authenticated() 
      .and() 
      .formLogin() 
       .usernameParameter("j_username") 
       .passwordParameter("j_password") 
       .loginPage("/login") 
       .defaultSuccessUrl("/", true) 
       .successHandler(customAuthenticationSuccessHandler) 
       .permitAll() 
      .and() 
       .logout() 
       .logoutUrl("/logout") 
       .invalidateHttpSession(true) 
       .logoutSuccessUrl("/") 
       .deleteCookies("JSESSIONID") 
       .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 
      .and() 
       .csrf(); 
} 
+0

può aiutarmi nella mia domanda per favore? https://stackoverflow.com/questions/46065063/spring-boot-basic-authentication –

+0

Qualsiasi progetto di esempio che include tutti i requisiti? –

3

sicurezza primavera anche molto utile per fornire l'autenticazione e l'autorizzazione al REST URL. Non è necessario specificare alcuna implementazione personalizzata.

Prima di tutto, è necessario specificare il punto di ingresso-rif per restare AutenticazioneEntryPoint nella configurazione di sicurezza come di seguito.

<security:http pattern="/api/**" entry-point-ref="restAuthenticationEntryPoint" use-expressions="true" auto-config="true" create-session="stateless" > 

    <security:intercept-url pattern="/api/userList" access="hasRole('ROLE_USER')"/> 
    <security:intercept-url pattern="/api/managerList" access="hasRole('ROLE_ADMIN')"/> 
    <security:custom-filter ref="preAuthFilter" position="PRE_AUTH_FILTER"/> 
</security:http> 

L'implementazione per il restoAuthenticationEntryPoint potrebbe essere la seguente.

@Component 
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { 

    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { 
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); 
    } 
} 

Dopo questo è necessario specificare RequestHeaderAuthenticationFilter. Contiene la chiave RequestHeader. Questo è fondamentalmente usato per identificare l'autenticazione dell'utente. Generalmente RequestHeader trasporta queste informazioni mentre effettua le chiamate REST. Ad esempio si consideri sottostante Codice

<bean id="preAuthFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter"> 
    <property name="principalRequestHeader" value="Authorization"/> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    </bean> 

Qui,

<property name="principalRequestHeader" value="Authorization"/> 

"Autorizzazione" è la chiave ha presentato la richiesta in ingresso. Contiene le informazioni di autenticazione dell'utente necessarie. Inoltre è necessario configurare PreAuthenticatedAuthenticationProvider per soddisfare i nostri requisiti.

<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 
<property name="preAuthenticatedUserDetailsService"> 
    <bean id="userDetailsServiceWrapper" 
     class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
    <property name="userDetailsService" ref="authenticationService"/> 
    </bean> 
</property> 
</bean> 

Questo codice funzionerà per fissare gli URL REST per mezzo di Autenticazione e autorizzazione senza implementazioni personalizzate.

Per il codice completo si prega di trovare il link sottostante:

https://github.com/srinivas1918/spring-rest-security

0

Per convalidare REST API ci sono 2 modi

1 - Autenticazione di base utilizzando nome utente e password di default impostati nel file di application.properties

Basic Authentication

2 - autenticazione utilizzando database (u serDetailsService) con il nome utente e la password attuale

Advanced Authentication

Problemi correlati