Spring Security-PasswordEncoder密码解析器详解和自定义登录逻辑

简介: Spring Security-PasswordEncoder密码解析器详解和自定义登录逻辑

一、PasswordEncoder密码解析器详解


Spring Security要求容器中必须有PasswordEncoder实例。所以当自定义登录逻辑时要求必须给容器注入PaswordEncoder的bean对象


1.接口介绍


  1. encode():把参数按照特定的解析规则进行解析。


  1. matches()验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹配,则返回true;如果不匹配,则返回false。第一个参数表示需要被解析的密码。第二个参数表示存储的密码。


  1. upgradeEncoding():如果解析的密码能够再次进行解析且达到更安全的结果则返回true,否则返回false。默认返回false。

image.png

2.内置解析器介绍


在Spring Security中内置了很多解析器。


image.png


3.BCryptPasswordEncoder简介


BCryptPasswordEncoder是Spring Security官方推荐的密码解析器,平时多使用这个解析器。


BCryptPasswordEncoder是对bcrypt强散列方法的具体实现。是基于Hash算法实现的单向加密。可以通过strength控制加密强度,默认10.


4.代码演示


在项目src/test/java下新建com.msb.MyTest测试BCryptPasswordEncoder用法。


@SpringBootTest
@RunWith(SpringRunner.class)
public class MyTest {
    @Test
    public void test(){
        //创建解析器
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        //对密码进行加密
        String password = encoder.encode("123");
        System.out.println("------------"+password);
        //判断原字符加密后和内容是否匹配
        boolean result = encoder.matches("123",password);
        System.out.println("============="+result);
    }
}
复制代码




二、自定义登录逻辑


当进行自定义登录逻辑时需要用到之前讲解的UserDetailsService和PasswordEncoder。但是Spring Security要求:当进行自定义登录逻辑时容器内必须有PasswordEncoder实例。所以不能直接new对象。


1.编写配置类


新建类com.msb.config.SecurityConfig 编写下面内容


@Configuration
public class SecurityConfig {
    @Bean
    public PasswordEncoder getPwdEncoder(){
        return new BCryptPasswordEncoder();
    }
}
复制代码


2.自定义逻辑


在Spring Security中实现UserDetailService就表示为用户详情服务。在这个类中编写用户认证逻辑。


@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private PasswordEncoder encoder;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //1. 查询数据库判断用户名是否存在,如果不存在抛出UsernameNotFoundException
        if(!username.equals("admin")){
            throw new UsernameNotFoundException("用户名不存在");
        }
        //把查询出来的密码进行解析,或直接把password放到构造方法中。
        //理解:password就是数据库中查询出来的密码,查询出来的内容不是123
        String password = encoder.encode("123");
        return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}
复制代码


3.查看效果


重启项目后,在浏览器中输入账号:admin,密码:123。后可以正确进入到login.html页面。



相关文章
|
4天前
|
XML 安全 前端开发
Spring Security 重点解析(下)
Spring Security 重点解析
13 1
|
4天前
|
缓存 前端开发 Java
【框架】Spring 框架重点解析
【框架】Spring 框架重点解析
18 0
|
4天前
|
安全 NoSQL Java
Spring Security 重点解析(上)
Spring Security 重点解析
15 1
|
4天前
|
存储 算法 安全
|
4天前
|
canal 缓存 关系型数据库
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
|
4天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
4天前
|
XML IDE Java
Spring_bean注解(xml解析)
Spring_bean注解(xml解析)
11 0
|
4天前
|
存储 前端开发 Java
Javaweb之SpringBootWeb案例之登录校验功能的详细解析
Javaweb之SpringBootWeb案例之登录校验功能的详细解析
9 0
|
4天前
|
JSON 前端开发 数据安全/隐私保护
Javaweb之SpringBootWeb案例之 登录功能的详细解析
Javaweb之SpringBootWeb案例之 登录功能的详细解析
15 0
|
4天前
|
XML Java 数据格式
Spring IOC的源码解析
【4月更文挑战第17天】Spring IOC(控制反转)的核心功能是通过依赖注入(DI)来管理对象的创建和它们之间的依赖关系。要深入理解Spring IOC的工作原理,我们可以从其源码分析入手,特别是关注如何创建和管理Bean以及依赖注入的实现
22 1

推荐镜像

更多