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 giderParola (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:
- bir authenticationSuccessHandler ile özel bir authenticationFilter kullanın. Açıkça çalışmıyor çünkü kullanıcı zaten bu noktada oturum açmış.
- Giriş noktası ref filtresinin uygulanmasını sağlayın.
- Özel bir filtre, BASIC_AUTH_FILTER
- 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.
- 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 { ... }
Mesaj çözümünüzü yardımcı olur. ;) – bluish