spring security进阶2 添加帐户并对帐户密码进行加密

spring security 添加帐户并对帐户密码进行加密

上一篇博文中介绍了spring security如何使用数据库中的帐户进行认证登陆,此次来总结下如何给数据库添加帐户并对密码加密。前端

上一篇:使用数据库密码进行认证java

1、原理分析

1.1加密原理

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

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中能够直接注入spring

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

1.2加密后的登陆过程

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

2、代码实现

具体的工程代码能够参考个人工程示例,下文中只给出了和添加用户相关的部分。框架

在配置文件中配置加密类dom

<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层这里就再也不列举了。

3、测试

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

选择注册新帐号后跳转到注册页面

输入帐户和密码后注册,会在数据库中插入一条新的记录。


这里我页面上输入的是 admin/admin,数据库中存储的password是加密后的

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

4、用加密后的帐号登陆

此时若是使用刚刚新建的这个帐号进行登陆就会登陆失败。由于咱们并无配置spring security认证时的加密方式,默认是不进行加密,因此会直接将前台输入的密码和数据库中的加密字符串进行比较。

要使用这个帐号登陆还须要进行以下配置

在spring security的配置文件中配置加密策略

<security:authentication-manager>
        <!--配置使用给定的userservice完成认证-->
        <security:authentication-provider user-service-ref="userService">
            <security:password-encoder ref="passwordEncoder"/>
        </security:authentication-provider>
    </security:authentication-manager>

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

在userService的loadUserByUsername方法中去除密码字符串上拼接的{noop}字符串,原本这个就是为了适配密码未加密的状况

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserInfo userInfo = userDao.findByUsername(username);
        User user=new User(userInfo.getUsername(),userInfo.getPassword(),getRoles());
        return user;
}

而后使用刚才注册的 admin/admin就能够登陆成功了。

注意若是进行了上面两部,数据库中之前的帐户将不能进行登陆了,由于数据库中的密码是没有加密的,而框架会对前台传递的密码进行加密后再和数据库中的比较。因此必定要记住上面新注册的这个帐号admin/admin

这里我给出admin对应的加密字符串

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

若是你们忘记了刚才注册的帐号,能够在数据库中插入一条admin/admin的记录。

5、总结

添加帐户主要是须要用spring security自带的加密类BCryptPasswordEncoder对用户密码进行加密。

要使用新注册的帐户登陆就须要在配置文件中配置加密策略

配置后原来的帐号由于密码没有加密将不能使用

6、示例工程源码

示例工程已经上传到码云上,若是有须要欢迎你们参考

示例工程

相关文章
相关标签/搜索