2013-08-13 40 views
5

SpringMVC web hizmetini, kullanıcı adı ve parola göndererek Spring Security kullanarak kimlik doğrulaması gereken bir SpringMVC web uygulamasına sahibim. Bir kullanıcı oturum açtığında, kullanıcının tarayıcısına bir çerez ayarlanması ve sonraki aramalarda kullanıcı oturumunun, çerez kullanılarak başka bir RESTful web hizmeti ile doğrulanması gerekir.Spring MVC + Spring Güvenli bir oturum açma hizmetiyle oturum açın

Her yere bakıyorum ama bunun nasıl gerçekleştirileceğine dair iyi bir örnek bulamadım ve tüm girişimlerim boşa çıktı. İşte

aklımda ne var:

ben ilan iki kimlik doğrulama-sağlayıcıları, ilk kontroller çerez olabilir ve herhangi bir nedenle başarısız olursa o kullanıcı adı ve birlikte kontrol ikincisi gider

Parola (bu istekte kullanıcı adı ve parola yoksa da başarısız olur).

Her iki hizmet de kullanıcı yetkililerini her defasında döndürür ve yay güvenliği "durum bilgisi" dür. Öte yandan, eğer bu yaklaşımın doğru olup olmadığını kendim sorguladım, çünkü aynı sorunu yaşayan bir örneği veya bir başkasını bulmak çok zordu. Bu yaklaşım yanlış mı?

Sadece JDBC kimlik doğrulaması yerine bunu yapmak istememin sebebi, tüm web uygulamamın durum bilgisiz olması ve veritabanına her zaman bir "dilekçe kuyruğu" yazan RESTful web hizmetleri aracılığıyla erişilmesidir, buna saygı duymak isterim Kullanıcı doğrulama ve doğrulama için de.

Şimdiye kadar neler denedim? Uzun uzun springSecurity-context.xml yapıştırın olabilir, ama sadece şimdilik yerine onları anlatayım:

  1. bir authenticationSuccessHandler ile özel bir authenticationFilter kullanın. Açıkça çalışmıyor çünkü kullanıcı zaten bu noktada oturum açmış.
  2. Giriş noktası ref filtresinin uygulanmasını sağlayın.
  3. Özel bir filtre, BASIC_AUTH_FILTER
  4. konumuna getirin. Özel bir Kimlik Doğrulama Sağlayıcısı (şanssız bir çok şey yapın!) Yapın. Bazı cevaplar alırken tekrar deniyorum.
  5. Bunun yerine bir soru yazmaya karar verdiğimde CAS kullanmaya başlıyordum. Belki de gelecekte web sunucumda bir CAS sunucusu bulundurmayı düşünebilirim, ancak şu an için bu çok büyük bir overkill gibi görünüyor.

Şimdiden teşekkürler!

BTW, Spring Security 3.1.4 ve Spring MVC 3.2 kullanıyorum.3

DÜZENLEME: ne yaptım biraz ışık ben cevap burada

@coder İÇİN BT SAYESİNDE yapamıyordu, ben bütün bu belgelemek ve burada ya bir blog yazısında göndermeye çalışacağım bazen yakında:

<http use-expressions="true" create-session="stateless" entry-point-ref="loginUrlAuthenticationEntryPoint" 
     authentication-manager-ref="customAuthenticationManager"> 
    <custom-filter ref="restAuthenticationFilter" position="FORM_LOGIN_FILTER" /> 
    <custom-filter ref="restPreAuthFilter" position="PRE_AUTH_FILTER" /> 
    <intercept-url pattern="/signin/**" access="permitAll" /> 
    <intercept-url pattern="/img/**" access="permitAll" /> 
    <intercept-url pattern="/css/**" access="permitAll" /> 
    <intercept-url pattern="/js/**" access="permitAll" /> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 

</http> 

<authentication-manager id="authManager" alias="authManager"> 
    <authentication-provider ref="preauthAuthProvider" /> 
</authentication-manager> 

<beans:bean id="restPreAuthFilter" class="com.company.CustomPreAuthenticatedFilter"> 
    <beans:property name="cookieName" value="SessionCookie" /> 
    <beans:property name="checkForPrincipalChanges" value="true" /> 
    <beans:property name="authenticationManager" ref="authManager" /> 
</beans:bean> 

<beans:bean id="preauthAuthProvider" 
    class="com.company.CustomPreAuthProvider"> 
    <beans:property name="preAuthenticatedUserDetailsService"> 
     <beans:bean id="userDetailsServiceWrapper" 
      class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
      <beans:property name="userDetailsService" ref="userDetailsService" /> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

<beans:bean id="userDetailsService" class="com.company.CustomUserDetailsService" /> 

<beans:bean id="loginUrlAuthenticationEntryPoint" 
    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <beans:constructor-arg value="/signin" /> 
</beans:bean> 

<beans:bean id="customAuthenticationManager" 
    class="com.company.CustomAuthenticationManager" /> 

<beans:bean id="restAuthenticationFilter" 
    class="com.company.CustomFormLoginFilter"> 
    <beans:property name="filterProcessesUrl" value="/signin/authenticate" /> 
    <beans:property name="authenticationManager" ref="customAuthenticationManager" /> 
    <beans:property name="authenticationFailureHandler"> 
     <beans:bean 
      class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"> 
      <beans:property name="defaultFailureUrl" value="/login?login_error=t" /> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

Ve Özel Uygulamalar böyle bir şey vardır:

// Here, the idea is to write authenticate method and return a new UsernamePasswordAuthenticationToken 
public class CustomAuthenticationManager implements AuthenticationManager { ... } 

// Write attemptAuthentication method and return UsernamePasswordAuthenticationToken 
public class CustomFormLoginFilter extends UsernamePasswordAuthenticationFilter { ... } 

// Write getPreAuthenticatedPrincipal and getPreAuthenticatedCredentials methods and return cookieName and cookieValue respectively 
public class CustomPreAuthenticatedFilter extends AbstractPreAuthenticatedProcessingFilter { ... } 

// Write authenticate method and return Authentication auth = new UsernamePasswordAuthenticationToken(name, token, grantedAuths); (or null if can't be pre-authenticated) 
public class CustomPreAuthProvider extends PreAuthenticatedAuthenticationProvider{ ... } 

// Write loadUserByUsername method and return a new UserDetails user = new User("hectorg87", "123456", Collections.singletonList(new GrantedAuthorityImpl("ROLE_USER"))); 
public class CustomUserDetailsService implements UserDetailsService { ... } 
+0

Mesaj çözümünüzü yardımcı olur. ;) – bluish

cevap

3
  1. , SoyutPreAuthenticatedProcessingFilter öğesini genişleterek özel bir ön-filtre filtresi tanımlayabilirsiniz. getPreAuthenticatedPrincipal() yöntemini nasıl uygulanması çerez varsa kontrol edebilirsiniz ve eğer varsa dönüş çerez adı kimlik başlıca ve çerez değeri ise
  2. .
  3. Kullanım PreAuthenticatedAuthenticationProvider ve başka onun geçerli da verilmiş getirme yetkililer, kullanıcı adı/şifre kullanarak kullanıcı kimlik doğrulaması için BadCredentialsException
  4. gibi AuthenticationException atmak bir form giriş filtresi, temel-filtre eklerseniz çerez vali, olup olmadığını kontrol etmek için özel preAuthenticatedUserDetailsService sağlamak veya özel kimlik doğrulama sağlayıcısından (veya özel userdetailsService) ile özel bir filtre öncesi kimlik doğrulama filtresi springContext ve username./password filtresi denilen olmayacak içinde kimliği doğrulanmış kullanıcı ayarlayacaktır Varlığından vaka çerezi, kullanıcı/parola

doğrulamak için, Çerez yanlış/geçersiz ise, kimlik doğrulama giriş noktası doğrulamayı tetikler kullanıcı adı/şifre

kullanarak ication yerine sorunuzu düzenleme, bir cevap lütfen olarak

+0

Hello @coder, hepsi mantıklı. Ben deneyeceğim ve sonuçları yazacağım. Teşekkürler! – hectorg87

+1

@ hector87 Uygulamanızı ve yapılandırmanızı paylaşabilir misiniz? Teşekkürler. –

+0

Evet, uygulama ile de ilgileniyorum. Bir yere gönderebilir misin? Çok teşekkürler –

İlgili konular