1 介绍

任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。有很多标准的算法比 SHA 或者 MD5,结合 salt (盐)是一个不错的选择。Spring Security 提供了 BCryptPasswordEncoder 类,实现 Spring 的 PasswordEncoder 接口使用 BCrypt 强哈希方法来加密密码。

BCrypt 强哈希方法每次加密的结果都不一样。

2 准备工作

2.1 maven 依赖

org.springframework.boot

spring-boot-starter-security

复制代码

2.2 WebSecurityConfig 配置类

我们在添加了 spring security 依赖后,所有的地址都被 spring security 所控制了,我们目前只是需要用到 BCrypt 密码加密的部分,所以我们要添加一个配置类,配置为所有地址都可以匿名访问。

/**

* 安全配置类

*/

@Configuration

@EnableWebSecurity

public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

@Override

public void configure(HttpSecurity http) throws Exception{

http.authorizeRequests()

.antMatchers("/**").permitAll()

.anyRequest().authenticated()

.and().csrf().disable();

}

}

复制代码

说明:

authorizeRequests():所有 security 全注解配置实现的开端,表示开始说明需要的权限。需要的权限分为两个部分:1.拦截的路径;2.访问该路径需要的权限。

antMatchers():表示拦截什么路径。

permitAll():表示任何权限到可以访问,直接放行所有。

anyRequest():任何的请求。

authenticated():认证之后才能访问。

.and().csrf().disable():固定写法,表示使 csrf 拦截失效。

2.3 注入 BCryptPasswordEncoder 类到容器

@SpringBootApplication

public class UserApplication{

public static void main(String[] args){

SpringApplication.run(UserApplication.class, args);

}

@Bean

public IdWorker idWorker(){

return new IdWorker(1, 1);

}

@Bean

public BCryptPasswordEncoder bcryptPasswordEncoder(){

return new BCryptPasswordEncoder();

}

}

复制代码

3 加密

3.1 Service 层加密

调用 BCryptPasswordEncoder 的 public String encode(CharSequence rawPassword) 方法,传参就用封装在 Admin 中的 password 字段。

@Service

public class AdminService{

@Autowired

AdminDao adminDao;

@Autowired

IdWorker idWorker;

@Autowired

BCryptPasswordEncoder bCryptPasswordEncoder;

public void addAdmin(Admin admin){

admin.setId(idWorker.nextId() + "");

admin.setPassword(bCryptPasswordEncoder.encode(admin.getPassword()));

adminDao.save(admin);

}

}

复制代码

3.2 dao 层

public interface AdminDao extends JpaRepository, JpaSpecificationExecutor{

}

复制代码

3.3 controller 层

@RequestMapping(value = "/admin")

@RestController

@CrossOrigin

public class AdminController{

@Autowired

AdminService adminService;

@PostMapping

public Result addAdmin(@RequestBody Admin admin){

adminService.addAdmin(admin);

return new Result(StatusCode.OK, true, "增加管理员成功");

}

}

复制代码

3.4 测试

4 解密

4.1 AdminDao 增加方法定义

通过登录名到数据库中获取 admin 的全部信息,封装到 Admin 中。

public interface AdminDao extends JpaRepository, JpaSpecificationExecutor{

Admin findByLoginname(String loginname);

}

复制代码

4.2 AdminService 增加方法

主要用到了 public boolean matches(CharSequence rawPassword, String encodedPassword) 方法,第一位填写 “生密码” 即手动输入的密码,第二位填写 “加密之后的密码” 即数据库中保存的密码。

public Admin login(Admin admin){

Admin adminFromSQL = adminDao.findByLoginname(admin.getLoginname());

if (adminFromSQL != null && bCryptPasswordEncoder.matches(admin.getPassword(), adminFromSQL.getPassword())) {

return adminFromSQL;

}

return null;

}

复制代码

4.3 AdminController 增加方法

@PostMapping(value = "/login")

public Result login(@RequestBody Admin admin){

Admin adminLogin = adminService.login(admin);

if (adminLogin == null) {

return new Result(StatusCode.ERROR, false, "登录失败");

}

return new Result(StatusCode.OK, true, "登录成功");

}

复制代码

4.4 测试

bcrypt java maven_BCrypt 密码加密相关推荐

  1. 应用JAVA进行密码加密的一种算法

    应用JAVA进行密码加密的一种算法 发表于<河北科技大学学报>(2007-7 Vol.28,P122) 摘要:在这篇文章中将要介绍一种简单的密码不可逆加密算法的实现,代码采用的是java语 ...

  2. java提供密码加密的实现

    Md5加密 /*** 提供密码加密的类*/ public class Md5Util {public static String encode(String msg){try {MessageDige ...

  3. bcrypt java maven_BCrypt.checkpw()无效的盐版本异常

    我正在Play 2.1中尝试使用BCrypt实现身份验证.Java应用程序,但是Invalid salt version exception在尝试对用户进行身份验证时会遇到问题. 这是我的堆栈跟踪 p ...

  4. java登陆密码加密怎么做,Java如何实现密码加密

    在查询时,我们如果要对用户的登录信息进行加密,通常会将其密码进行加密. 1) 可以借助spring框架工具类DigestUtils 2) 也可以使用shiro框架来实现 以上就是两者方式分别使用, 注 ...

  5. (java)密码加密。某系统的数字密码,比如1983,采用加密方式进行传输,规则如下:先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。

    package com.ag.practice;import java.util.Scanner;public class jiami { //某系统的数字密码,比如1983,采用加密方式进行传输,规 ...

  6. java 明文密码加密解密,明文加密解密处理

    配置文件加密和数据库一些内容的加密存储 背景 在一些项目的设计中,密码等一些重要的东西显然是不能出现在代码和数据库中的.如果出现,这显然是不符合安全规定的.所以我们就需要加密存储和解密取出,这就用了本 ...

  7. Java——MD5密码加密

    目录 1.MD5概述 1.1.什么是MD5? 1.2.MD5加密作用 1.3.什么要使用MD5加密? 2.MD5加密流程 2.1.工具类导入 2.2.用户注册模块使用MD5 2.3.登录问题解决 1. ...

  8. java md密码加密_JavaSE_对密码进行MD5加密

    package me.falcon.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExc ...

  9. java 数据库密码加密解密方法

    代码如下: package com.example.demo.test;import com.alibaba.druid.filter.config.ConfigTools; import com.a ...

最新文章

  1. 快速认识网络爬虫与Scrapy网络爬虫框架
  2. android 测试工程 关闭混淆,混淆Android Test项目以及项目(在发布和混淆版本上运行测试)...
  3. altium designer 自动扇出功能
  4. 字符串在指针和数组上赋值的区别
  5. 读书节来当当薅羊毛!170买400/240买600
  6. Java解决循环注入问题
  7. [转]ubuntu network is unreachable 解决记
  8. SpringCloud学习笔记016---在windows下搭建的Redis服务_在SpringBoot中使用Redis
  9. Java并发(二)——ThreadLocal
  10. 双目测距(四)--罗德里格斯变换
  11. 开发自己的博客转发插件(跨域)
  12. scp创建远程目录_如何在 HPC 硬件上远程运行大型仿真?
  13. 湖南大学 离散数学 2018年期末考试 参考答案
  14. C语言从入门到放弃2022年8月2号
  15. 大繁至简,首度揭秘阿里云飞天洛神系统
  16. 刚刚用鸿蒙跑了个“hello world”!跑通后,我特么开始怀疑人生了....
  17. 渗透测试漏洞利用入门总结
  18. 安卓、苹果怎么多开微信?微信多开软件
  19. Qt任务栏图标增加进度条
  20. c++中关于cin.tie以及sync_witch_stdio同步

热门文章

  1. SQLHelper通用类执行一条返回结果集的SqlCommand命令 使用方法
  2. 【requests爬虫用xpath解析_1】
  3. 纳昇电子柔性材料与器件测试系统---让柔性测试标准化
  4. uniapp、微信小程序--自定义table
  5. buuoj、xmctf、攻防世界刷题(web)write up
  6. 汽车产业格局图 | 高清电子版 | 爱普搜汽车
  7. 通过微信模板消息跳转到小程序
  8. 一些关于学习BW的基础理解
  9. R语言ggplot2可视化绘制累计频率图、累积分布图(cumulative frequency/density distribution)
  10. iOS几个关键字(nonnull、nullable、null_resettable、__null_unspecified)