Spring 安全性 - 使用 CAS、MySQL、SearchModeSearchDatabaseAuthenticationHandler 和 BasicDataSource 的 Bcrypt

Spring Security - Bcrypt with CAS, MySQL, SearchModeSearchDatabaseAuthenticationHandler, and BasicDataSource

如果我有一个数据库存储使用 Spring 的 Bcrypt 编码器加密的用户名和密码,我将如何使用当前设置将其解码回 Spring 中的纯文本?

我的 MySQL 有这个 table 用于身份验证:

username     |  password     |  enabled
----------------------------------------
varchar(50)  |  varchar(100)  |  tinyint

密码字段将包含每个用户的 Bcrypt 密码。

现在是 CAS 的 deployerConfigContext.xml。

<bean class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler">
    <property name="tableUsers"><value>user_authentication</value></property>
    <property name="fieldUser"><value>username</value></property>
    <property name="fieldPassword"><value>password</value></property>
    <property name="dataSource" ref="dataSource"/>
  </bean>

我将数据源定义为:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:mysql://localhost:3306/user_mgt</value>
    </property>
    <property name="username"><value>root</value></property>
    <property name="password"><value>test_pw</value></property>
</bean>

我不确定我是否可以在没有自定义的情况下实现 Bcrypt 解码。

当您使用散列密码时,不可能取回纯文本,为此我们使用散列算法来放置散列密码。 要对用户进行身份验证,您必须将数据库中的散列密码与用户输入的散列密码进行比较。 Spring 安全人员为您完成,您只需告诉 spring 安全人员您在配置中使用了 BCryptPasswordEncoder:

<authentication-manager>
    <authentication-provider>
       .......
       <password-encoder red="encoder"/>
    </authentication-provider>
</authentication-manager>
.........
<beans:bean id="encoder" class="org.springframework.security.crypto.password.BCryptPasswordEncoder"/>

请参阅 spring 安全文档