5

W mojej aplikacji Spring Boot z RESTful webservices skonfigurowałem Spring Security razem z Spring Social i SpringSocialConfigurer.Weryfikacja/autoryzacja Spring Security poprzez punkt końcowy REST

W tej chwili mam dwa sposoby uwierzytelniania/autoryzacji - przez nazwę użytkownika/hasło i przez sieci społecznościowe, na przykład Twitter.

W celu realizacji uwierzytelniania/autoryzacji za pośrednictwem własnego punktu końcowego relaksującego w moim kontroler wiosny MVC REST Dodałem następujący sposób:

@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(); 
} 

ale nie jestem pewien, co dokładnie musi być zwrócony do klienta po udanej /login wywołanie punktu końcowego. Myślę, że zwrócenie pełnego obiektu uwierzytelniania jest zbędne.

Co należy zwrócić klientowi w przypadku udanego uwierzytelnienia?

Czy możesz mi powiedzieć, jak poprawnie wdrożyć tę metodę logowania?

Również w przypadku Restfull logowania Muszę UsernamePasswordAuthenticationToken aw przypadku logowania poprzez Twitter Muszę SocialAuthenticationToken Czy mogę mieć różne znaki w samej aplikacji?

Odpowiedz

2

można skonfigurować co do powrotu na pomyślnym uwierzytelnieniu za pomocą metod nadrzędnych w 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 
     } 

    } 
} 

Dodatkowo można również obsługiwać odpowiedzi awaria:


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

Mam nadzieję, że pomoże ... !!!

+0

Dziękuję za odpowiedź. Właśnie tego używam w mojej obecnej aplikacji. – alexanoid

1

Restful calls powinien zawsze zwracać kod odpowiedzi. W twoim przypadku powinno być tylko 200 OK. W przypadku awarii 401 Nieautoryzowane. Posiadanie różnych żetonów jest absolutnie w porządku, i tak nie możesz tego użyć.

Ja osobiście wolałbym obsługiwać punkty końcowe logowania za pomocą filtrów Spring Security, a nie kontrolerów, ponieważ można lepiej kontrolować przepływ.

+0

Czy istnieje jakakolwiek dokumentacja lub wskazówki dotyczące postępowania z punktem końcowym logowania za pomocą filtru Spring Security? – rastadrian

+0

Jest na pewno. Można wyszukiwać przykłady konfiguracji Spring Security Java i szukać niestandardowych implementacji punktu wejścia uwierzytelniania lub filtrów logowania. Oto jeden przykład: http://blog.jdriven.com/2014/10/stateless-spring-security-part-2-stateless-authentication/ – Vaelyr