5

Nella mia applicazione Spring Boot con servizi web RESTful ho configurato Spring Security insieme a Spring Social e SpringSocialConfigurer.Spring Security autenticazione/autorizzazione tramite endpoint REST

In questo momento ho due modi di autenticazione/autorizzazione - tramite nome utente/password e tramite social network, ad esempio Twitter.

Al fine di implementare l'autenticazione/autorizzazione tramite il mio punto finale RESTful nel mio controller Spring MVC resto Ho aggiunto seguente metodo:

@RequestMapping(value = "/login", method = RequestMethod.POST) 
public Authentication login(@RequestBody LoginUserRequest userRequest) { 
    Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(userRequest.getUsername(), userRequest.getPassword())); 
    boolean isAuthenticated = isAuthenticated(authentication); 
    if (isAuthenticated) { 
     SecurityContextHolder.getContext().setAuthentication(authentication); 
    } 
    return authentication; 
} 

private boolean isAuthenticated(Authentication authentication) { 
    return authentication != null && !(authentication instanceof AnonymousAuthenticationToken) && authentication.isAuthenticated(); 
} 

ma non sono sicuro di cosa esattamente deve essere restituito al cliente dopo successo /login chiamata endpoint. Penso che la restituzione di un oggetto di autenticazione completo sia ridondante.

Cosa deve essere restituito al client in caso di autenticazione avvenuta con successo?

Potrebbe dirmi come implementare correttamente questo metodo di accesso?

Inoltre, in caso di login RESTfull avrò UsernamePasswordAuthenticationToken e in caso di accesso tramite Twitter avrò SocialAuthenticationToken Va bene avere diversi token in una stessa applicazione?

risposta

2

È possibile configurare quali per tornare il successo di autenticazione con metodi prevalente alla SimpleUrlAuthenticationSuccessHandler


public class CustomAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { 


    public CustomAuthenticationSuccessHandler() { 
     super(); 
     setRedirectStrategy(new NoRedirectStrategy()); 
    } 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
      Authentication authentication) throws IOException, ServletException { 

     super.onAuthenticationSuccess(request, response, authentication); 
     ObjectMapper mapper = new ObjectMapper(); 

     response.setContentType("application/json;charset=UTF-8"); 
     response.getWriter().print(mapper.writeValueAsString(objectToBereturned); 
     response.getWriter().flush(); 
    } 

    protected class NoRedirectStrategy implements RedirectStrategy { 

     @Override 
     public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) 
       throws IOException { 
      // any redirect if required. leave the implementation black if not needed 
     } 

    } 
} 

Inoltre è possibile anche gestire la risposta di errore:


public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { 
    @Override 
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, 
      AuthenticationException exception) throws IOException, ServletException { 
     response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
    } 
} 

Spero che aiuti ... !!!

+0

Grazie per la risposta. Questo è esattamente ciò che uso già per la mia attuale applicazione. – alexanoid

1

Le chiamate di riposo devono sempre restituire il codice di risposta. Nel tuo caso dovrebbe essere solo 200 OK. In caso di fallimento 401 non autorizzato. Avere diversi token è assolutamente valido, non è comunque possibile utilizzare lo stesso.

Personalmente preferirei gestire gli endpoint di accesso tramite i filtri Spring Security e non i controller in quanto è possibile controllare meglio il flusso.

+0

Esiste qualche documentazione o guida su come gestire l'endpoint di accesso tramite un filtro Spring Security? – rastadrian

+0

Ci sono di sicuro. È possibile cercare esempi di configurazione Java di Spring Security e cercare implementazioni del punto di ingresso per l'autenticazione personalizzata o filtri di accesso. Ecco un esempio: http://blog.jdriven.com/2014/10/stateless-spring-security-part-2-stateless-authentication/ – Vaelyr