Spring security实现对账户进行加密

2020-03-07 16:04:22于丽

一、原理分析1.1加密原理

首先前端页面发送注册的账户信息到controller层,然后依次经过service层和dao层,最后入库。其中对密码的加密应该放在service层进行,加密后再入库。

spring security中有一个加密类BCryptPasswordEncoder可以用来对密码进行加密,调用其中的encode方法返回一个加密后的字符串

public String encode(CharSequence rawPassword) {
    String salt;
    if (strength > 0) {
      if (random != null) {
        salt = BCrypt.gensalt(strength, random);
      }
      else {
        salt = BCrypt.gensalt(strength);
      }
    }
    else {
      salt = BCrypt.gensalt();
    }
    return BCrypt.hashpw(rawPassword.toString(), salt);
}

使用时可以在spring的配置文件中配置一个加密类的bean,这样在service中可以直接注入

加密后数据库中存储的是加密过后的字符串。

1.2加密后的登录过程

对密码进行加密后数据库中存储的是加密字符串,用户发起登录请求后,框架会使用相同的加密算法对前端传递的密码进行加密并得到加密字符串,然后和数据库中查询到的字符串进行对比。

二、代码实现

具体的工程代码可以参考我的工程示例,下文中只给出了和添加用户相关的部分。

在配置文件中配置加密类

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

2.1添加用户的页面如下, register.html

<html>
  <head>
    <meta charset="UTF-8">
    <title>注册页面</title>
  </head>
  <body>

  <form action="/user/add.do" method="post">
    用户名:<input type="text" name="username" placeholder="请输入用户名"><br>
    密 码:<input type="password" name="password" placeholder="请输入密码"><br>
    <input type="submit" value="注册">
  </form>
  </body>
</html>

2.2controller层创建一个增加用户的方法

@RestController
@RequestMapping("/user")
public class UserController {

  @Autowired
  private IUserService userService;

  @PostMapping("/add")
  public String add(UserInfo userInfo){
    userService.add(userInfo);
    return "success";
  }
}

2.3service层

@Autowired
private BCryptPasswordEncoder passwordEncoder;
...//省略其他
@Override
public void add(UserInfo userInfo) {
  //对密码加密
  userInfo.setPassword(passwordEncoder.encode(userInfo.getPassword()));
  userDao.add(userInfo);
}

这里的passwordEncoder就是在配置文件中配置的加密bean,注入后可以直接使用

dao层这里就不再列举了。

三、测试

启动工程并成功登录后,跳转到首页,