2016-03-09 27 views
0

在我的Spring項目中,我定義了自己的自定義身份驗證提供程序。在引入Spring Security之前,我在Java代碼中使用了BCrypt,現在在數據庫中進行BCrypting後保存密碼。如何將brcypt編碼器引用到定製身份驗證提供程序?

彈簧security.xml文件

<security:authentication-manager> 
      <security:authentication-provider ref="myAuthenticationProvider"> 
      </security:authentication-provider> 
     </security:authentication-manager> 

    <b:bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> 

    <b:bean id="myAuthenticationProvider" class="com.cT.www.provider.CustomAuthenticationProvider"> 
    </b:bean> 

而且我自定義的身份驗證提供如下所示。

@Component 
public class CustomAuthenticationProvider implements AuthenticationProvider { 

    public CustomAuthenticationProvider() { 
     super(); 
    } 


    @Autowired 
    private PersonService personService;  

    @Override 
    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException { 

     System.out.println(authentication.getName() + "principal" +(String) authentication.getCredentials()); 

     String username = authentication.getName(); 
     String password = (String) authentication.getCredentials(); 

     UserSignUp user = (UserSignUp) personService.loadUserByUsername(username); 

     if (user == null || !user.getUsername().equalsIgnoreCase(username)) { 
      throw new BadCredentialsException("Username not found."); 
     } 

     if (!password.equals(user.getPassword())) { 
      throw new BadCredentialsException("Wrong password."); 
     } 

     List<Role> authorities = user.getAuthorities(); 

     return new UsernamePasswordAuthenticationToken(user, password, authorities); 
    } 

    @Override 
    public boolean supports(Class<?> arg0) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

} 

我不想使用user-service-ref在彈簧security.xml文件wihtin認證經理。

回答

0

您可以參考BCryptPasswordEncoder這樣:

<authentication-manager> 
    <authentication-provider> 
     <password-encoder ref="encoder" /> 
    </authentication-provider> 
    </authentication-manager> 

    <beans:bean id="encoder" 
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> 
    <beans:constructor-arg name="strength" value="11" /> 
    </beans:bean> 

詳見http://www.mkyong.com/spring-security/spring-security-password-hashing-example/

+0

我得到這個org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置問題:authentication-provider元素在與'ref'屬性一起使用時不能有子元素。另外我想引用我的自定義身份驗證提供程序。 – user3705478

1

如果您的用戶密碼數據庫已經儲存爲BCrypt你並不需要太多的做事情。在您的身份驗證方法,就像下面

if (BCrypt.checkpw(password, user.getPassword())) { 
     throw new BadCredentialsException("Wrong password."); 
    } 

參考BCrypt源的詳細信息,取代密碼檢查條件。

+0

好的。我現在所面臨的另一個問題是\t @覆蓋 \t認證公開身份驗證(驗證認證) \t \t \t拋出的AuthenticationException { \t \t authentication.getCredentials()返回「」但authentication.getName()返回由用戶輸入的用戶名在登錄表單中。 – user3705478

+0

它可能是'password-parameter'在登錄表單上的密碼字段上不匹配。如果答案是正確的,並且您的主要問題已解決,請接受答案 – Yogesh

相關問題