2016-04-05 37 views
0

Spring Security'deki sorunumla ilgili yardımınızı sormak istiyorum. Kullanıcı tarafından seçilen seçeneğe bağlı olarak bir giriş bilgisini doğrulamak zorunda olduğum bir gereksinimim var. Seçenek 1, oturum açmış kullanıcıyı üçüncü taraf hizmeti aracılığıyla doğrular. Seçenek 2 veritabanı doğrulama seviyesini kullanarak normal doğrulama olurdu. Bunu nasıl uygulayabilirim?Yay Güvenliğinde Özel Kimlik Doğrulama Uygulaması

cevap

5

Genel Strateji

  1. org.springframework.security.authentication.AuthenticationProvider özel olarak uygulanması sağlayın o delegeler uygun arka uca kimlik doğrulaması (üçüncü taraf servis, başka AuthenticationProvider, vs.).
  2. Doğru kimlik doğrulama arka ucunu seçmesini sağlamak için kullanıcı tarafından seçilen seçeneği özel AuthenticationProvider geçirin.
  3. Özel olarak AuthenticationProvider varsayılan kimlik doğrulama sağlayıcısı olarak yapılandırın.

Adım 1: AuthenticationProvider

AuthenticationProvider uygulamak tek bir yöntem ile bir arabirimdir.

class DelegatingAuthenticationProvider implements AuthenticationProvider { 
    @Autowired 
    private ThirdPartyAuthenticationService service; 

    @Autowired 
    @Qualifier("anotherAuthenticationProvider") 
    private AuthenticationProvider provider; 

    @Override 
    public Authentication authenticate(final Authentication authentication) throws AuthenticationException { 
    // Get the user selection. 
    String selection = (String) authentication.getDetails(); 

    // Take action depending on the selection. 
    Authentication result; 
    if("ThirdParty".equals(selection)) { 
     // Authenticate using "service" and generate a new 
     // Authentication "result" appropriately. 
    } 
    else { 
     // Authenticate using "provider" and generate a new 
     // Authentication "result" appropriately. 
    } 

    return result; 
    } 
} 

Adım 2: Bu nedenle, özel bir uygulama gibi görünebilir AuthenticationProvider uygulama yukarıdakilerden details özelliğinden kullanıcı seçimini alır AuthenticationProvider

kullanıcı seçimini iletin Authentication nesnesi. Muhtemelen, kullanıcı seçiminin HttpServletRequest'dan alınması ve AuthenticationProvider çağrılmadan önce Authentication nesnesine eklenmesi gerekir. Bu, Authentication ve HttpServletRequest nesnelerine erişime sahip olan ve AuthenticationProvider uygulanmadan önce çağrılan başka bir bileşen anlamına gelir.

Authentication nesnesi, AbstractAuthenticationProcessingFilter'un bir uygulaması tarafından oluşturulur. Bu sınıf, nesnesini kabul eden ve Authentication nesnesini döndüren attemptAuthentication adlı bir yönteme sahiptir. Öyle görünüyor ki, ihtiyaç duyulan şeyleri uygulamak için iyi bir aday olur. Kullanıcı adı-şifre tabanlı kimlik doğrulama için uygulama sınıfı UsernamePasswordAuthenticationFilter'dur. Bu sınıf, Authentication'un bir uygulaması olan UsernamePasswordAuthenticationToken'un yeni bir örneğini döndürür. Yani, UsernamePasswordAuthenticationFilter'u genişleten bir sınıf yeterli olmalıdır.

class ExtendedUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter { 
    @Override 
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { 
    ... 
    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, password); 
    authentication.setDetails(obtainUserSelection(request)); 

    ... 

    return authentication; 
    } 
} 

obtainUserSelection isteği dışında kullanıcı seçimini alır özel bir yöntemdir.

Adım 3: yapılandırma

Yapılandırma Spring Güvenlik konfigürasyonunda AuthenticationProvider ve filtre uygulamaları. Tam adımlar XML veya Java yapılandırmasının kullanılmasına bağlı olarak değişecektir.

+0

wow..thanks manish! Bu bir sürüş öğrenme bahar güvenliği bir heck. Bu benim ilk uygulamam yol. Beni ExtendedUsernamePasswordAuthenticationFilter uygulamasıyla ilgili bir eğitim sitesine yönlendirebilir misin? lütfen :) –

+0

[UsernamePasswordAuthenticationFilter'] 'ın resmi uygulamasını inceleyebilirsiniz: https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security /web/authentication/UsernamePasswordAuthenticationFilter.java). – manish

İlgili konular