2013-07-03 12 views
6

Ya ben bir şey eksik veya nasıl çalıştığını bu ... Yani
, ben UserDetailsService uygulanan ve alt-tabaka (AppUser aşağıda) yay yardımcı sınıf User (yani UserDetails uygulayan). Bu konularda, bu böyle şeyler: SonraYay güvenliği, başarısız oturum açmada UserDetails yerine asıl dize olarak döndürüyor?

@Override 
public UserDetails loadUserByUsername(String username) 
throws UsernameNotFoundException { 
    // try loading user by its name 
    SystemUser user = null; 
    try { 
     user = this.sysUserService.getByUsername(username); 
     if(user == null) 
      throw new UsernameNotFoundException("User not found!"); 
    } 
    catch(Exception e) { 
     throw new DataRetrievalFailureException(
       "Could not load user with username: " + username); 
    } 
    // load user rights, and create UserDetails instance 
    UserDetails res = new AppUser(user, getUserAuthorities(user)); 

    return res; 
} 

Ben bu yaklaşımı kullanarak hesap kilitleme uygulamaya çalışmıştır: den asıl nesneyi almaya çalışırken Ancak

public class LoginFailureEventListenter implements 
ApplicationListener<AuthenticationFailureBadCredentialsEvent> { 

// rest omitted for brevity 

@Override 
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) { 
    // ... 

    SystemUser user = ((AppUser)event.getAuthentication().getPrincipal()).getSystemUser(); 
    // cast exception - how is it possible to obtain String 
    // instead of UserDetails object here ? 
    // ... 
} 
} 

, ben java.lang.ClassCastException koştu sağlanan olay argümanı (asıl nesne tür String idi). Demek istediğim, Tamam - Ben sorunu çözmek için, tekrar SystemUser benim kullanıcı adı yükleyebilirim, ama ben bunu beklemiyordum ...
Bu belge için bile kaynak belgelerinin bile getPrincipal()UserDetails örneğini döndürmesi gerektiğini belirtiyor.
Düşünceler?

cevap

5

Kimlik doğrulama hatasıyla uğraştığımız için, olaydaki Authentication nesnesi, AuthenticationManager'a gönderilen (ve reddedilen) nesnedir.

Tipik bir senaryoda, bu, "asıl" özelliğin gönderilen kullanıcı adı olduğu UsernamePasswordAuthenticationToken olacaktır.

AuthenticationManager birçok farklı kimlik doğrulama mekanizmasını destekler ve kendi bakış açısıyla, UserDetailsService kimlik doğrulamasında bile yer aldığının garantisi yoktur. Tek bildiği, kimlik doğrulama belirtecinin kabul edilmemesi (bir istisna vardı) ve olayı buna göre yayınlar.

AuthenticationProvider'u kullanabileceğiniz alternatif seçenekler şunlardır veya AuthenticationFailureHandler'u (örneğin, form-oturum açma kullanıyorsanız) takın ve fazladan işler yapın.

+0

Yani, bu aslında olması gerektiği gibi ...? Ben zaten sıfırlama için 'AuthenticationSuccessHandler' kullanıyorum, bu doğru yaklaşım olup olmadığını söyleyemem, 'AuthenticationFailureHandler' ile denemek için bana gelmedi. – Less

+0

Evet, böyle olması gerekiyordu. Etkinlik "bu başarısız olan kimlik doğrulama isteği" diyor ve kimlik doğrulama isteği yalnızca kullanıcı için bir dize tanımlayıcısı içeriyor. –

İlgili konular