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对用户密码进行加密。

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

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

六、示例工程源码

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

示例工程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringSecurity的防Csrf攻击实现代码解析

    CSRF(Cross-site request forgery)跨站请求伪造,也被称为One Click Attack或者Session Riding,通常缩写为CSRF或XSRF,是一种对网站的恶意利用.尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站.与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性. CSRF是一种依赖web浏览器的

  • Spring Security使用数据库认证及用户密码加密和解密功能

    流程图: 1.接上一篇博客https://mp.csdn.net/console/editor/html/104576494,准备好环境. 2.spring-security.xml中的配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="

  • 详解Spring Security认证流程

    前言 Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固. 相关版本: java: jdk 8 spring-boot: 2.1.6.RELEASE 过滤器链和认证过程 一个认证过程,其实就是过滤器链上的一个绿色矩形Filter所要执行的过程. 基本的认证过程有三步骤: Filter拦截请求,生成一个未认证的Authentication,交由AuthenticationManager进行认证: AuthenticationManager的

  • Spring Security和Shiro的相同点与不同点整理

    Spring Security和Shiro的区别 相同点 1.认证功能 2.授权功能 3.加密功能 4.会话管理 5.缓存支持 6.rememberMe功能 ... 不同点 1.Spring Security 基于Spring 开发,项目若使用 Spring 作为基础,配合 Spring Security 做权限更加方便,而 Shiro 需要和 Spring 进行整合开发: 2.Spring Security 功能比 Shiro 更加丰富些,例如安全维护方面: 3.Spring Security

  • SpringSecurity rememberme功能实现过程解析

    记住我功能原理分析 还记得前面咱们分析认证流程时,提到的记住我功能吗? 现在继续跟踪找到AbstractRememberMeServices对象的loginSuccess方法: 再点进去上面if判断中的rememberMeRequested方法,还在当前类中: 如果上面方法返回true,就表示页面勾选了记住我选项了. 继续顺着调用的方法找到PersistentTokenBasedRememberMeServices的onLoginSuccess方法: 注意name和value属性的值不要写错哦!

  • SpringSecurity权限控制实现原理解析

    菜单控制: 可以用来判断这个用户是不是有这些角色,没有的话就不展示 数据控制: 由于数据都是从后端查的,在后端控制权限就可以了 <!-- 开启权限控制注解支持 jsr250-annotations="enabled"表示支持jsr250-api的注解,需要jsr250-api的jar包 pre-post-annotations="enabled"表示支持spring表达式注解 secured-annotations="enabled"这才是

  • Spring security BCryptPasswordEncoder密码验证原理详解

    一.加密算法和hash算法的区别 加密算法是一种可逆的算法,基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为"密文",但在用相应的密钥进行操作之后就可以得到原来的内容 . 哈希算法是一种不可逆的算法,是把任意长度的输入通过散列算法变换成固定长度的输出,输出就是散列值,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值. 二.源码解析 BCryptPasswordEncoder类实现了PasswordEncoder接口,这个接口中定义

  • Spring Security常用过滤器实例解析

    Spring Security常见的15个拦截器 1 . org.springframework.security.web.context.SecurityContextPersistenceFilter 首当其冲的一个过滤器,作用之重要,自不必多言. SecurityContextPersistenceFilter主要是使用SecurityContextRepository在session中保存或更新一个 SecurityContext,并将SecurityContext给以后的过滤器使用,来

  • Spring security实现对账户进行加密

    一.原理分析1.1加密原理 首先前端页面发送注册的账户信息到controller层,然后依次经过service层和dao层,最后入库.其中对密码的加密应该放在service层进行,加密后再入库. spring security中有一个加密类BCryptPasswordEncoder可以用来对密码进行加密,调用其中的encode方法返回一个加密后的字符串 public String encode(CharSequence rawPassword) { String salt; if (streng

  • Spring Security如何实现升级密码加密方式详解

    目录 本章内容 密码加密方式怎么升级? 升级方案源码 实战 第一种方式: Spring Bean 他是怎么自动升级到BCrypt加密方式的? 第二种方式: 多继承接口方式 第三种方式: HttpSecurity直接添加 本章内容 密码加密方式怎么升级? spring security底层怎么实现的密码加密方式升级? 密码加密方式怎么升级? 前面我们学过DelegatingPasswordEncoder类,但是不清楚他到底是做什么的,我也没讲的很清楚.所以呢,我们就重新再讲一讲它的另一个实际应用.

  • Spring Security实现多次登录失败后账户锁定功能

    在上一次写的文章中,为大家说到了如何动态的从数据库加载用户.角色.权限信息,从而实现登录验证及授权.在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等待一定的时间之后才能再次进行登录操作. 一.基础知识回顾 要实现多次登录失败账户锁定的功能,我们需要先回顾一下基础知识: Spring Security 不需要我们自己实现登录验证逻辑,而是将用户.角色.权限信息以实现UserDetails和UserDetailsService接口的方式告知Spring

  • SpringBoot浅析安全管理之Spring Security配置

    目录 Spring Security 的基本配置 基本用法 1. 创建项目添加依赖 2. 添加 hello 接口 3. 启动项目测试 配置用户名和密码 基于内存的认证 HttpSecurity 登录表单详细配置 注销登录配置 多个 HttpSecurity 密码加密 1. 为什么要加密 2. 加密方案 3. 实践 方法安全 在 Java 开发领域常见的安全框架有 Shiro 和 Spring Security.Shiro 是一个轻量级的安全管理框架,提供了认证.授权.会话管理.密码管理.缓存管理

  • spring security 5.x实现兼容多种密码的加密方式

    前言 本文主要给大家介绍了关于spring security 5.x实现兼容多种密码的加密方式,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1.spring security PasswordEncoder spring security 5不需要配置密码的加密方式,而是用户密码加前缀的方式表明加密方式,如: {MD5}88e2d8cd1e92fd5544c8621508cd706b代表使用的是MD5加密方式: {bcrypt}$2a$10$eZeGvVV2ZXr/vgiV

  • Spring Security基于散列加密方案实现自动登录功能

    目录 前言 一. 自动登录简介 1. 为什么要自动登录 2. 自动登录的实现方案 二. 基于散列加密方案实现自动登录 1. 配置加密令牌的key 2. 配置SecurityConfig类 3. 添加测试接口 4. 启动项目测试 三. 散列加密方案实现原理 1. cookie的加密原理分析 2. cookie的解码原理分析 3. 自动登录的源码分析 3.1 令牌生成的源码分析 3.2 令牌解析的源码分析 前言 在前面的2个章节中,一一哥 带大家实现了在Spring Security中添加图形验证码

  • Spring Boot(四)之使用JWT和Spring Security保护REST API

    通常情况下,把API直接暴露出去是风险很大的,不说别的,直接被机器攻击就喝一壶的.那么一般来说,对API要划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户开放对应的API.目前,比较主流的方案有几种: 用户名和密码鉴权,使用Session保存用户鉴权结果. 使用OAuth进行鉴权(其实OAuth也是一种基于Token的鉴权,只是没有规定Token的生成方式) 自行采用Token进行鉴权 第一种就不介绍了,由于依赖Session来维护状态,也不太适合移动时代,新的项目就不要采用了.

  • Spring security基于数据库中账户密码认证

    一.原理分析 前台的登录请求发送到后端后会由spring security进行拦截,即controller层由框架自己提供.这样用户名和密码的认证就需要在service层完成,所以框架需要在service层获取到我们自己的数据库账号信息. spring security 提供了一个接口 UserDetailsService 来让用户提供账号和密码,其内容如下 public interface UserDetailsService { UserDetails loadUserByUsername(

  • 全面解析Spring Security 内置 Filter

    1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面.其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的.我怎么知道自定义过滤器要加在 UsernamePasswordAuthenticationFilter 之前.我在这个系列开篇说了 Spring Security 权限控制的一个核心关键就是 过滤器链 ,这些过滤器如下图进行过滤传递,甚至比这个更复杂!这只是一个最小单元. Spring Se

随机推荐