具有config(application ationContext-security.xml):

<authentication-manager alias="authenticationManager">
    <authentication-provider>
    <password-encoder hash="sha"/>
        <jdbc-user-service data-source-ref="dataSource"/>
    </authentication-provider>
</authentication-manager>

来自另一边的SQL来self 的dataSource(它是JdbcDaoImpl):

...
    public static final String DEF_USERS_BY_USERNAME_QUERY =
            "select username,password,enabled " +
            "from users " +
            "where username = ?";
...

现在这个代码中有大约sha个单词,所以从标准Spring Security users表中 Select 的密码没有编码.

也许我应该在下面为我Hibernate映射配置中的password列提供大约sha个属性:

<class name="model.UserDetails" table="users">
    <id name="id">
        <generator class="increment"/>
    </id>
    <property name="username" column="username"/>
    <property name="password" column="password"/>
    <property name="enabled" column="enabled"/>
    <property name="mail" column="mail"/>
    <property name="city" column="city"/>
    <property name="confirmed" column="confirmed"/>
    <property name="confirmationCode" column="confirmation_code"/>

    <set name="authorities" cascade="all" inverse="true">
        <key column="id" not-null="true"/>
        <one-to-many class="model.Authority"/>
    </set>

</class>

目前,密码按原样保存到数据库,但应该进行编码.

如何将applicationContext位好友的配置和DB查询密码编码成相同的?

推荐答案

如果您自己 Select 散列系统,而不是使用已包含散列密码的现有数据库构建应用程序,则应确保您的散列算法也使用SALT.不要只使用简单的摘要.

一个不错的 Select 是bcrypt,我们现在通过BCryptPasswordEncoder(使用jBCrypt实现)直接支持Spring Security3.1中的bcrypt.这会自动生成一个SALT,并将其与散列值连接在单个字符串中.

一些数据库具有内置的散列支持(例如,Postgres).否则,您需要在将密码传递给JDBC之前自己对其进行散列:

String password = "plaintextPassword";
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);

这就是创建用户时对密码进行编码所需的全部操作.

对于身份验证,您可以使用以下内容:

<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

<bean id="authProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
  <property name="userDetailsService" ref="yourJdbcUserService" />
  <property name="passwordEncoder" ref="encoder" />
</bean>

Database相关问答推荐

在德尔菲中,不活动所有fdconnect、fdselect和fdtable

包含接受Cassandra中多个数据的语句

为什么 INNER JOIN 不等于(!=)永远挂起

sql-dump 有什么用?

什么是非规范化 mysql 数据库的好方法?

NOSQL 非规范化数据模型

SQL Server 2008如何同步不同服务器中的数据库?

单向和双向关系关系的区别

是否应该强制执行参照完整性?

如何关闭 Rails 中的updated_at列?

判断Android中的应用程序数据库中是否存在列

Select * 和 Select [列出每个列] 之间有区别吗

当另一个进程修改数据库时Hibernate二级缓存失效

在单个 postgres 查询中多次调用 `now()` 是否总是给出相同的结果?

在 PostgreSQL 中索引空值

根据上次日期 Select 记录

使用 Django 的复合/复合主/唯一键

C# IEnumerator/yield struct 可能不好?

每个开发人员一个数据库?

Rails 控制台 - 查找在某天创建的位置