2013-04-25 12 views
10

Sto tentando di creare un servizio Web riposante che verrà utilizzato da altri servizi Web. Idealmente, quando un client accede al servizio e non è autenticato, dovrebbe ottenere un 401. Voglio che un utente sia in grado di autenticarsi aggiungendo un'intestazione di autenticazione alla richiesta. Non voglio che l'utente compili un modulo di accesso e lo pubblichi. Inoltre, non voglio che memorizzi alcuna credenziale di accesso in un cookie (cioè mantenendo lo stato) che dovrebbe essere presente nell'header di autenticazione invia con ogni richiesta. Ho usato Spring Roo per creare il servizio web.Resta autenticazione di base tramite sicurezza di primavera senza login modulo

Quello che ho attualmente, (tratto da una delle esercitazioni di sicurezza 3.1 di primavera), quando l'utente ottiene un 401, viene promosso con una pagina di accesso e quindi posta la pagina, ottenendo un cookie che inviano con ciascuno richiesta.

Ecco il mio xml sicurezza primavera.

<http use-expressions="true"> 
    <intercept-url pattern="/customers/**" access="isAuthenticated()" /> 
<intercept-url pattern="/**" access="denyAll" /> 
<form-login /> 
</http> 
<authentication-manager> 
    <authentication-provider> 
     <user-service> 
      <user name="alice" password="other" authorities="user" /> 
      <user name="custome1" password="other" authorities="user" /> 
     </user-service> 
    </authentication-provider> 
</authentication-manager> 

Quando trasmetto una richiesta da ricciolo, ottengo il seguente:

$ curl -i -H "Accept: application/json" -H "Authorization: Basic Y3VzdG9tZXIxOm90aGVy" http://localhost:8080/Secured/customers 

HTTP/1.1 302 Found 
Server: Apache-Coyote/1.1 
Set-Cookie: JSESSIONID=B4F983464F68199FA0160DBE6279F440; Path=/Secured/; HttpOnly 
Location:  http://localhost:8080/Secured/spring_security_login;jsessionid=B4F983464F68199FA0160DBE6279F440 
Content-Length: 0 
Date: Thu, 25 Apr 2013 17:18:48 GMT 

dove il mio colpo di testa di token di base è Base64 (Customer1: altro)

Come posso ottenere il servizio web accettare l'intestazione auth e non reindirizzarmi a una pagina di accesso?

Quando rimuovo il file da security.xml, ottengo il seguente excpetion: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Problema di configurazione: Impossibile stabilire AuthenticationEntryPoint. Assicurati di avere un meccanismo di accesso configurato tramite lo spazio dei nomi (come login-form) o specifica un AuthenticationEntryPoint personalizzato con l'attributo 'entry-point-ref'

risposta

8

Ho bisogno di rimuovere <form-login> e aggiungere <http-basic>. Aggiunta anche crea-session- "stateless" alla mia configurazione.

<http use-expressions="true" create-session="stateless" > 
    <intercept-url pattern="/customers/**" access="isAuthenticated()" /> 
    <intercept-url pattern="/**" access="denyAll" /> 
    <http-basic/> 
</http> 
1

seguire questo test demo di JAX-RS con la sicurezza di primavera http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/jax_rs/spring_security/

questo è l'approccio semplice per l'autenticazione senza promuovere credenziali.

si può andare con la realizzazione RequestHandler e prioritario

public Response handleRequest(Message message, ClassResourceInfo resourceClass); 

segue: http://cxf.apache.org/docs/secure-jax-rs-services.html per set completo di approccio.

6

Ecco una configurazione non-XML Esempio per l'autenticazione riposo o con la forma o con qualunque base necessaria:

.and().httpBasic(); 

fa la magia!))

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 


    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
      .antMatchers("/someurl").hasRole("ADMIN") 
      .antMatchers("/anotherurl").hasRole("USER") 
      .antMatchers("/", "main").permitAll().anyRequest().authenticated() 
      .and() 
      .httpBasic(); 

     http.formLogin() 
      .loginPage("/login").permitAll() 
      .and() 
      .logout().permitAll(); 
    } 
... 
} 
Problemi correlati