在本教程中,我们将向您展示如何使用BCryptPasswordEncoder
在Spring Security中哈希密码并执行登录身份验证。
通常,在过去,我们通常使用MD5 Md5PasswordEncoder
或SHA ShaPasswordEncoder
哈希算法来编码密码……您仍然可以使用所需的任何编码器,但是Spring建议使用BCrypt BCryptPasswordEncoder
,这是一种更强大的哈希算法,具有随机生成的盐。
使用的技术:
- 春天3.2.8。发布
- Spring Security 3.2.3发布
- Spring JDBC 3.2.3.RELEASE
- MySQL服务器5.6
1.查看PasswordEncoder
不再使用熟悉的旧认证PasswordEncoder
接口…
package org.springframework.security.authentication.encoding;
//Implementation : Md5PasswordEncoder and ShaPasswordEncoder
@Deprecated
public interface PasswordEncoder {
相反,您应该使用此新的加密PasswordEncoder
接口。
package org.springframework.security.crypto.password;
//Implementation : BCryptPasswordEncoder
public interface PasswordEncoder {
2.生成BCrypt密码
首先,对密码进行哈希处理,然后将其放入数据库中,以便以后进行登录身份验证。 本示例使用BCryptPasswordEncoder
哈希密码“ 123456”。
package com.mkyong.web.controller;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class PasswordEncoderGenerator {
public static void main(String[] args) {
int i = 0;
while (i < 10) {
String password = "123456";
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);
System.out.println(hashedPassword);
i++;
}
}
}
在BCrypt哈希算法中,每次生成长度为60的不同哈希值。
$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.
$2a$10$trT3.R/Nfey62eczbKEnueTcIbJXW.u1ffAo/XfyLpofwNDbEB86O
$2a$10$teJrCEnsxNT49ZpXU7n22O27aCGbVYYe/RG6/XxdWPJbOLZubLIi2
$2a$10$BHG59UT6p7bgT6U2fQ/9wOyTIdejh4Rk1vWilvl4b6ysNPdhnViUS
$2a$10$W9oRWeFmOT0bByL5fmAceucetmEYFg2yzq3e50mcu.CO7rUDb/poG
$2a$10$HApapHvDStTEwjjneMCvxuqUKVyycXZRfXMwjU0rRmaWMsjWQp/Zu
$2a$10$GYCkBzp2NlpGS/qjp5f6NOWHeF56ENAlHNuSssSJpE1MMYJevHBWO
$2a$10$gwbTCaIR/qE1uYhvEY6GG.bNDQcZuYQX9tkVwaK/aD7ZLPptC.7QC
$2a$10$5uKS72xK2ArGDgb2CwjYnOzQcOmB7CPxK6fz2MGcDBM9vJ4rUql36
$2a$10$6TajU85/gVrGUm5fv5Z8beVF37rlENohyLk3BEpZJFi6Av9JNkw9O
每次使用BCrypt散列值时,获得一个不同的值是正常的,因为盐是随机生成的。 在本教程中,我们获得第一个输出并将其插入数据库。
3.数据库
创建表并插入用户“ mkyong”进行测试。
CREATE TABLE users (
username VARCHAR(45) NOT NULL ,
password VARCHAR(60) NOT NULL ,
enabled TINYINT NOT NULL DEFAULT 1 ,
PRIMARY KEY (username));
CREATE TABLE user_roles (
user_role_id int(11) NOT NULL AUTO_INCREMENT,
username varchar(45) NOT NULL,
role varchar(45) NOT NULL,
PRIMARY KEY (user_role_id),
UNIQUE KEY uni_username_role (role,username),
KEY fk_username_idx (username),
CONSTRAINT fk_username FOREIGN KEY (username) REFERENCES users (username));
INSERT INTO users(username,password,enabled)
VALUES ('mkyong','$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.', true);
INSERT INTO user_roles (username, role)
VALUES ('mkyong', 'ROLE_USER');
INSERT INTO user_roles (username, role)
VALUES ('mkyong', 'ROLE_ADMIN');
4.启用密码编码器
在XML配置中启用密码编码器的几种方法。
4.1使用默认的BCryptPasswordEncoder 。
<authentication-manager>
<authentication-provider>
<password-encoder hash="bcrypt" />
</authentication-provider>
</authentication-manager>
4.2将“强度”参数传递给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>
4.3将编码器传递给DaoAuthenticationProvider 。
<bean id="authProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="customUserService" />
<property name="passwordEncoder" ref="encoder" />
</bean>
<bean id="encoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
4.4注释示例。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
DataSource dataSource;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth)
throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.passwordEncoder(passwordEncoder())
.usersByUsernameQuery("sql...")
.authoritiesByUsernameQuery("sql...");
}
@Bean
public PasswordEncoder passwordEncoder(){
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
5.项目演示
访问受密码保护的页面: localhost:8080 / spring-security-password-hashing / admin ,显示登录页面。 输入密码“ 123456”,Spring Security将对密码进行哈希处理并将其与数据库中的哈希密码进行比较。
数据库中的用户名和密码。
下载源代码
下载– spring-security-password-hashing.zip (18 KB)
下载– spring-security-password-hashing-annotation.zip (22 KB)
参考文献
翻译自: https://mkyong.com/spring-security/spring-security-password-hashing-example/