Spring Security使用详解9(密码加密配置)

在之前的文章中密码都是使用明文的方式进行存储,但这样会有很大的安全隐患。所以正常做系统时,密码都要加密处理。而在 Spring Boot 中配置密码加密非常容易,下面通过样例进行演示。

九、密码加密配置

1、样例代码

(1)要配置密码加密只需要修改两个地方。首先要修改 HttpSecurity 配置中的 PasswordEncoder 这个Bean 的实现,这里我们采用 BCryptPasswordEncoder 加密方案。

Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder:

  • BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选择提供 strength 和 SecureRandom 实例。
  • strength 取值在 4~31 之间(默认为 10)。strength 越大,密钥的迭代次数越多(密钥迭代次数为 2^strength)

(2)接着将用户的密码改成使用 BCryptPasswordEncoder 加密后的密码(如果是数据库认证,库里的密码同样也存放加密后的密码)

注意:虽然这里三个用户加密后的密码不一样,但明文其实都是 123。这是因为即使同一密码每次 Bcrypt 生成的结果都会变化

1@Configuration 2public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter { 3 // 指定密码的加密方式 4 @Bean 5 PasswordEncoder passwordEncoder(){ 6 // 使用BCrypt强哈希函数加密方案,密钥迭代次数设为10(默认即为10) 7 return new BCryptPasswordEncoder(10); 8 } 9 10 // 配置用户及其对应的角色 11 @Override 12 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 13 auth.inMemoryAuthentication() 14 .withUser("root") 15 .password("$2a$10$OahHKAjiYRxJb9eBeDNeTe0HapawUSY5qYRl/6O2qJUyK58ontFwW") 16 .roles("DBA") 17 .and() 18 .withUser("admin") 19 .password("$2a$10$nwG.X7cRIkRUN0siaaXI6uDnbZuB1XCnQK7KQ1sRWat69fIKF8ste") 20 .roles("ADMIN") 21 .and() 22 .withUser("hangge") 23 .password("$2a$10$AkEWXIFbKRDlypQ.kQxNDu.85ZCuiv77CGJLikwLxURDrVav6IDpy") 24 .roles("USER"); 25 } 26 27 // 配置 URL 访问权限 28 @Override 29 protected void configure(HttpSecurity http) throws Exception { 30 http.authorizeRequests() // 开启 HttpSecurity 配置 31 .antMatchers("/db/**").hasRole("DBA") // db/** 模式URL需DBA角色 32 .antMatchers("/admin/**").hasRole("ADMIN") // admin/** 模式URL需ADMIN角色 33 .antMatchers("/user/**").hasRole("USER") // user/** 模式URL需USER角色 34 .anyRequest().authenticated() // 用户访问其它URL都必须认证后访问(登录后访问) 35 .and().formLogin().loginProcessingUrl("/login").permitAll() // 开启表单登录并配置登录接口 36 .and().csrf().disable(); // 关闭csrf 37 } 38}

2、运行测试

启动项目后,我们仍然使用 123 这个密码进行登录。 

附:生成 Bcrypt 密码

通常来说用户信息是存储在数据库中,因此需要在用户注册时对密码进行加密处理。下面代码作用是当用户将密码从前端传过来之后,通过调用 BCryptPasswordEncoder 实例中的 encode 方法对密码进行加密处理,加密完成后将密文存入数据库。

1@Service 2public class RegService { 3 public int reg(String username, String password) { 4 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10); 5 String encodePasswod = encoder.encode(password); 6 return saveToDb(username, encodePasswod); 7 } 8}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

JAVA加解密算法设计与应用

业务场景APP移动端、WEB、桌面端、第三方平台密码等敏感数据加密设计如app端登录密码加密设计对于登录密码不需要进行解密只需要加密算法结合规则进行比较就能得到密码正确与否方法一(签名保证安全)1.密码等敏感信息取Md5值对所有值(加上timestamp)