2013-08-01 28 views
8

'u kullanarak nasıl programlanabilir bir şekilde kimlik doğrulaması yapabilirim? Bir kullanıcının kimliğini doğrulamak için burada ne yapıyorum? Kullanıcının hesabını etkinleştirmek için birkaç adımdan geçtiği bir uygulamam var ve bu nedenle giriş formunu atlayıp doğrudan kontrol paneline yönlendirmek istiyorum. Benim kimlik doğrulama sağlayıcısı olarak DaoAuthenticationProvider sınıfını kullanmalıdırKullanıcı tarafından SpringAuthenticationProvider

protected void automatedLogin(String username, String password, HttpServletRequest request) { 

     try { 
      // Must be called from request filtered by Spring Security, otherwise SecurityContextHolder is not updated 
      CustomUserDetailsService udService = new CustomUserDetailsService(userDAO, request); 
      UserDetails uDetails = udService.loadUserByUsername(username); 
      UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(uDetails, password); 
      token.setDetails(new WebAuthenticationDetails(request)); 
      DaoAuthenticationProvider authenticator = new DaoAuthenticationProvider(); 
      Authentication authentication = authenticator.authenticate(token); 
      SecurityContextHolder.getContext().setAuthentication(authentication); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      SecurityContextHolder.getContext().setAuthentication(null); 
     } 

    } 

: Burada

gibi benim otomatik giriş fonksiyonu görüntüsü. Ben doğru kimlik vb kimliği, otorite rolleri içeren bir UserDetails modeli alıyorum doğruladıktan

bir yere DaoAuthenticationProvider sınıfında yol boyunca boş Pointer içine koşuyorum kimlik doğrulaması yöntemini çağıran

:

org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider de org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:109) de

org.springframework.security.authentication.AuthenticationServiceException

. kimlik doğrulaması (AbstractUserDetail sAuthenticationProvider.java:132) com.bosch.actions.BaseController.doAutoLogin adresinden (BaseController.java:659) . . . 'I don gibi ben boş olanı gerçekten emin değilim org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:101)

de java.lang.NullPointerException: Neden Olduğu Kaynak kodu mevcut.

Düzenleme Burada kaynak kodunu bulabildim - https://github.com/SpringSource/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/dao/DaoAuthenticationProvider.java

açıkça nesne üzerinde UserDetailsService ayarlayarak Boş Pointer etrafında almak başardı: şimdi

authenticator.setUserDetailsService(udService); 

Ama Sağlanan parola doğru olduğunu bildiğimde kötü kimlik bilgisi özel durumu alıyorum, çünkü kodu daha önce UserDetails nesne kümesindeki hata ayıklayıcısında gördüm.

org.springframework.security.authentication.BadCredentialsException: org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks (DaoAuthenticationProvider.java:87) org.springframework.security en de Kötü kimlik bilgileri. authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate (AbstractUserDetailsAuthenticationProvider.java:149)

+0

Bahar Güvenlik kullanılabilir kaynak kodu var, açık kaynak. DaoAuthenticationProvider, bir yay yönetimli fasulye olarak tasarlandığından, muhtemelen sorunlarınız vardır. – samlewis

cevap

9

bir araya ekleme tarafından çalışma yay fasulyesi tanım ve se tanımlanan tüm özellikleri kimlik elde edebildi Onları DaoAuthenticationProvider nesnesinde programsal olarak tting. Geriye dönüp baktığımızda aptalca bir soru olmuş gibi görünüyor, ama umarım birilerine yardım eder!

Düzeltilmiş Kodu:

protected void automatedLogin(String username, String password, HttpServletRequest request) { 

     try { 
      // Must be called from request filtered by Spring Security, otherwise SecurityContextHolder is not updated 
      CustomUserDetailsService udService = new CustomUserDetailsService(userDAO, request); 
      CustomMd5PasswordEncoder passEncoder = new CustomMd5PasswordEncoder(); 
      ReflectionSaltSource saltSource = new ReflectionSaltSource(); 
      saltSource.setUserPropertyToUse("salt"); 
      UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password); 
      token.setDetails(new WebAuthenticationDetails(request)); 
      DaoAuthenticationProvider authenticator = new DaoAuthenticationProvider(); 
      authenticator.setUserDetailsService(udService); 
      authenticator.setPasswordEncoder(passEncoder); 
      authenticator.setSaltSource(saltSource); 
      Authentication authentication = authenticator.authenticate(token); 
      SecurityContextHolder.getContext().setAuthentication(authentication); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      SecurityContextHolder.getContext().setAuthentication(null); 
     } 

    } 
+3

Bir düzeltme bulduğuna sevindim, fakat dürüst olmak gerekirse, bu, Spring Security'nin nasıl kullanılacağı anlamına gelmiyor. Kendi başınıza çok fazla iş yapıyorsunuz, yapmanız gerekmiyor. – Akshay

+0

Bu uygulamada Spring Security uygulamasının normal kullanımı değildir. Bu, bir formda kimlik bilgilerini sağlamadan kullanıcıyı oturum açmam gereken bir kerelik bir örnektir. Her seferinde form aracılığıyla giriş yapacaklar ve bahar güvenlik fasulyesi işi yapacaklar. Bunu açıkladıktan sonra, cevabı düşüren sizseniz, umarım fikrinizi değiştirirsiniz, çünkü bence adil bir şekilde StackOverflow'ta saygınlığımı acıtıyor. – rawkfist0215

+0

Arkadaşımdan emin ol, ben sana oy vermedim. Cevabın yanlış olduğunu düşünmüyorum, sadece Spring Security'nin bu şekilde kullanılmasının gerekmediğini söylüyordum. Ve P.S. Oy vermeden, SO'mdaki itibarımı da azaltabilirsiniz ... :) – Akshay

İlgili konular