Spring Security入门(三):密码加密

前文导读

- Spring Security入门(一):登录与退出

- Spring Security入门(二):基于数据库验证

Github 地址

https://github.com/ChinaSilence/any-spring-security 本文对应 security-login-db-encryptPWD

摘要

解决2个问题:

  • 注册时密码加密后存入数据库
  • 登录时密码加密校验

运行程序

1、clone 代码

git clone https://github.com/ChinaSilence/any-spring-security.git

2、启动应用

mvn spring-boot:run

3、登录(使用账号 anoy 密码 pwd,未使用密码加密前是可以登录的)

控制台会出现如下提示:

Encoded password does not look like BCrypt

4、注册新账号并登录。

相关解释说明

相比于上一个demo,在 WebSecurityConfig 中添加了如下代码:

/**
     * 添加 UserDetailsService, 实现自定义登录校验
     */
    @Override
    protected void configure(AuthenticationManagerBuilder builder) throws Exception{
        builder.userDetailsService(anyUserDetailsService)
                .passwordEncoder(passwordEncoder());
    }

    /**
     * 密码加密
     */
    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

BCryptPasswordEncoder相关知识: 用户表的密码通常使用MD5等不可逆算法加密后存储,为防止彩虹表破解更会先使用一个特定的字符串(如域名)加密,然后再使用一个随机的salt(盐值)加密。 特定字符串是程序代码中固定的,salt是每个密码单独随机,一般给用户表加一个字段单独存储,比较麻烦。 BCrypt算法将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独处理salt问题。

BCryptPasswordEncoder 是在哪里使用的?

登录时用到了 DaoAuthenticationProvider ,它有一个方法 #additionalAuthenticationChecks(UserDetails userDetails,UsernamePasswordAuthenticationTokenauthentication),此方法用来校验从数据库取得的用户信息和用户输入的信息是否匹配。

在注册时,对用户密码加密

应用 BCryptPasswordEncoder 之后,明文密码是无法被识别的,就会校验失败,只有存入密文密码才能被正常识别。所以,应该在注册时对用户密码进行加密。

/**
     * 加密密码
     */
    private void encryptPassword(UserEntity userEntity){
        String password = userEntity.getPassword();
        password = new BCryptPasswordEncoder().encode(password);
        userEntity.setPassword(password);
    }

新用户注册后,数据库中就会存入密文密码,示例:

id

username

password

nickname

roles

5

testpwd

$2a$10$i9fKauPB/mUh8pA2xHTzN.LSAu5pqmfEboNqK6y2NU9PxAt80hLc2

加密测试

ROLE_USER

补充说明:即使不同的用户注册时输入相同的密码,存入数据库的密文密码也会不同。

原文发布于微信公众号 - 程序猿DD(didispace)

原文发表时间:2018-01-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java成神之路

Http Response Code

HTTP协议状态码表示的意思主要分为五类 ,大体是 :   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~   1××   保留    2...

1173
来自专栏技术小黑屋

Refused to Execute Script From Because Its MIME Type (Text/plain) Is Not Executable, and Strict MIME

今天又与这个问题相遇了,Orz,还是研究一下解决方法和出现原因吧。 刚刚在github上传了一个js文件,想让这个文件被其他网页引用,于是贴出了这个文件的ra...

2151
来自专栏一场梦

Servlet HTTP 状态码大全列表

1263
来自专栏码匠的流水账

spring security动态配置权限的方案2

使用这种方式,就没必要在每个方法上添加@PreAuthorize或者@Secured注解了,也就是不写死每个方法的权限,而是配置在数据库等其他存储,然后在Aut...

2221
来自专栏大内老A

谈谈基于OAuth 2.0的第三方认证 [下篇]

从安全的角度来讲,《中篇》介绍的Implicit类型的Authorization Grant存在这样的两个问题:其一,授权服务器没有对客户端应用进行认证,因为获...

2058
来自专栏V站

Servlet HTTP 状态码大全列表

状态行包括 HTTP 版本(在本例中为 HTTP/1.1)、一个状态码(在本例中为 200)和一个对应于状态码的短消息(在本例中为 OK)。

1652
来自专栏xingoo, 一个梦想做发明家的程序员

【java开发系列】—— struts2简单入门示例

前言   最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的。   stru...

2035
来自专栏JavaEdge

Spring Security 实战 - 退出原理实现源码分析

Spring Security的退出请求(默认为/logout)由LogoutFilter过滤器拦截处理

3303
来自专栏Java 源码分析

Filter过滤器

Filter接口和Servlet的接口是非常类似的,它里面只有三个方法。 1.Filter接口 init Filter创建的时候,启动服务器的时候创建Filt...

2907
来自专栏Clive的技术分享

HTTP常见状态码1xx 消息类,服务器临时回应2xx 浏览器请求被处理成功3xx 重定向4xx5xx 服务器错误

HTTP code 1xx 消息类,服务器临时回应 100 Continue 服务器已接收初始请求,浏览器继续发送请求其余部分 101 Switching P...

3455

扫码关注云+社区

领取腾讯云代金券