2012-10-14 16 views
8

Kimlik doğrulama sürecini işlemek için bir özel filtre UsernamePasswordAuthenticationFilter oluşturuyorum. Temel olarak, Kullanıcı REST/login aracılığıyla oturum açma http gönderimini gerçekleştirdiğinde, özel filtre yürütülür ve kullanıcı ayrıntılarını ve oluşturulan belirteci içeren bir json biçimine yanıt vermelidir.Özel bir filtreyi yürüttükten sonra json yanıtını programlı olarak nasıl döndürür UsernamePasswordAuthenticationFilter?

Sorunum, istemciye bir json yanıtı vermeyi ayarlıyorum? SavedRequestAwareAuthenticationSuccessHandler'ın bir alt sınıfını oluşturmayı ve burada json yanıtını ayarlamayı düşünüyorum. Bu iyi bir fikir mi? NoRedirectStrategy

public class MyAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { 

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

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

      super.onAuthenticationSuccess(request, response, authentication); 
      response.write("my JSON response"); 
    } 


    protected class NoRedirectStrategy implements RedirectStrategy { 

     @Override 
     public void sendRedirect(HttpServletRequest request, 
       HttpServletResponse response, String url) throws IOException { 
      // no redirect 

     } 

    } 

} 

Not:

Herhangi bir yardım çok) =

Teşekkür

Kendi SuccessHandler uygulamak ve UsernamePasswordAuthenticationFilter enjekte gerekir
+0

özel bir filtre uygulayan yerine sadece ihtiyacınız json üreten bir servlet'dir iletmek için bahar güvenlik yapılandırması kullanan bir nedeni var mı? – ElderMael

+0

@mael: Nedeni, varsayılan j_username/j_password giriş parametreleri adlarını geçersiz kılmaktır. Bu yüzden onu kullanıcı adı/şifre olarak değiştirdim. – Warner

+0

Sadece sizin için kendi filtrelerinizi uygulamanıza gerek yok: [_Veri varsayılan parametre isimleri SPRING_SECURITY_FORM_USERNAME_KEY ve SPRING_SECURITY_FORM_PASSWORD_KEY statik alanlarında bulunur. ** Parametre isimleri usernameParameter ve passwordParameter özelliklerini ayarlayarak da değiştirilebilir. ** ._] (http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/ güvenlik/web/kimlik doğrulama/UsernamePasswordAuthenticationFilter.html) – Xaerxess

cevap

5

takdir edilecektir varsayılan UsernamePassword filtre tarafından olacak Muhtemelen bu durumda istemediğiniz başarılı bir oturum açma sonrasında yönlendirin. Ayrıca, yukarıdaki uygulama filtresinin kimlik doğrulama başarısı için sonlandırıldığını unutmayın; filtrenizin doğru yanıtı oluşturduğundan emin olmanız gerekir. Bunu yapmak için altta yatan sunucu uygulamasına güvenmeyin. Alternatif olarak yönlendirmeyi yerinde bırakıp istemciye başka bir URL'ye gönderebilir ve bu da aradığınız JSON yanıtını döndürür.

Numune güvenlik içeriği:

<!-- Security --> 
    <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> 
     <sec:filter-chain-map path-type="ant"> 
      <sec:filter-chain pattern="/rest/login" filters="wsFilter"/> 
     </sec> 
    </bean> 

    <bean id="wsFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
     <property name="authenticationManager" ref="myAuthenticationManager"/> 
     <property name="authenticationSuccessHandler" ref="myAuthSuccessHandler"/> 
     <property name="passwordParameter" value="pass"></property> 
     <property name="usernameParameter" value="user"></property> 
     <property name="postOnly" value="false"></property> 
    </bean> 

     <bean id="myAuthSuccessHandler" class="com.my.MyAuthenticationSuccessHandler"/> 

    <sec:authentication-manager id="myAuthenticationManager" > 
     <sec:authentication-provider user-service-ref="UserDetailsImpl"> 
      <sec:password-encoder hash="md5"> 
      </sec:password-encoder> 
     </sec:authentication-provider> 
    </sec:authentication-manager> 
+0

Bu vücut yazımı response.getWriter(). Write (...) 'olmalıdır? – Pianosaurus

İlgili konular