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

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

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

一、原理分析

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

三、测试

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

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

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



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

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

四、用加密后的账号登录

此时如果使用刚刚新建的这个账号进行登录就会登录失败。因为我们并没有配置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的记录。

五、总结

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

要使用新注册的账户登录就需要在配置文件中配置加密策略

配置后原来的账号因为密码没有加密将不能使用

六、示例工程源码

示例工程已经上传到码云上,如果有需要欢迎大家参考

示例工程

spring security进阶2 添加账户并对账户密码进行加密的更多相关文章

  1. Spring Security进阶

    Spring Security进阶 1.连接数据库进行数据的验证 Spring Security进行身份验证或者权限控制时,用户名和密码应该要和数据库的进行比较才行,用户的各种信息我们从数据库中去获取 ...

  2. spring security进阶 使用数据库中的账户和密码认证

    目录 spring security 使用数据库中的账户和密码认证 一.原理分析 二.代码实现 1.新建一个javaWeb工程 2.用户认证的实现 3.测试 三.总结 spring security ...

  3. 使用 spring security 中的BcryptPasswordEncoder对象对用户密码进行加密

    一.引入security启动器 在子工程中直接引入,不用指定版本号 二.在启动类中把BCryptPasswordEncoder对象注入到容器中 三.在service 层注入 四. 调用encode方法 ...

  4. spring security的BCryptPasswordEncoder加密和对密码验证的原理

    目录 BCryptPasswordEncoder加密和对密码验证的原理 一.加密算法和hash算法的区别 二.源码解析 1. encode方法 2. BCrypt.hashpw方法 3. matche ...

  5. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...

  6. 【项目实践】一文带你搞定Spring Security + JWT

    以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...

  7. Spring Boot整合Spring Security

    Spring Boot对于该家族的框架支持良好,但是当中本人作为小白配置还是有一点点的小问题,这里分享一下.这个项目是使用之前发布的Spring Boot会员管理系统重新改装,将之前filter登录验 ...

  8. Spring Security方法级别授权使用介绍

    1.简介 简而言之,Spring Security支持方法级别的授权语义. 通常,我们可以通过限制哪些角色能够执行特定方法来保护我们的服务层 - 并使用专用的方法级安全测试支持对其进行测试. 在本文中 ...

  9. Spring Security实现短信验证码登录

    Spring Security默认的一个实现是使用用户名密码登录,当初我们在开始做项目时,也是先使用这种登录方式,并没有多考虑其他的登录方式.而后面需求越来越多,我们需要支持短信验证码登录了,这时候再 ...

随机推荐

  1. DT6.0框架留言模块漏洞修复

    今天早上登入后台,留言被国外乱码注入一大堆,很烦人,得去数据库清空.所以仔细检查dt的留言模块,找到解决办法. 在:module/extend/guestbook.inc.php 大约第10行左右 i ...

  2. zookeeper 的 docker 镜像使用

    dockerhub 网址:https://hub.docker.com/_/zookeeper

  3. Eclipse 打包运行maven项目

    https://www.cnblogs.com/tangshengwei/p/6341462.html      

  4. webuploader解决大文件断点续传

    文件夹数据库处理逻辑 public class DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject() ...

  5. WinDbg常用命令系列---内存数据显示和对应符号显示d*s(dds、dps、dqs)

    命令dds, dps,  dqs显示给定范围内的内存内容.假定该内存是符号表中的一系列地址.相应的符号也会显示出来. dds [Options] [Range] dqs [Options] [Rang ...

  6. chef test-kitchen Could not load the 'vagrant' driver from the load path 问题解决

    今天使用chef 的kitchen,运行kitchen list 发现了如下错误: >>>>>> ------Exception------- >>&g ...

  7. 用Python操作MySQL(pymysql)

    用python来操作MySQL,首先需要安装PyMySQL库(pip install pymysql). 连接MySQL: import pymysql connect=pymysql.connect ...

  8. 程序日志-应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址 LocalHost (使用 LRPC) 中的用户 NT AUTHORITY\SYSTEM SID (S-1-5-18)授予针对 CLSID 为 {D63B10C5-BB46-4990-A94F-E40B9D520

    应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址 LocalHost (使用 LRPC) 中的用户 NT AUTHORITY\SYSTEM SID (S-1-5-1 ...

  9. SDN第五次上机实验

    1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解. 1.通过源码安装RYU控制器 sudo apt-get install python3-pip git clo ...

  10. GIT 安装和升级

    git 安装: http://git-scm.com/download/mac git 升级: $ git clone git://git.kernel.org/pub/scm/git/git.git