Spring Security 教程(四):集成用户名密码

2022-08-16 21:29 阅读

上一章已经可以使用自定义的登录页面,一切看起来都很好,但是用户名密码并不是自己的。如何做到使用自己数据库里的用户名和密码呢?

UserDetailsService接口

使用数据库的用户名密码,需要实现UserDetailsService。配置如下:

    @Bean
    public UserDetailsService userDetailsService() {
        return new UserDetailsService() {
            @Override
            public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
                ...
            }
        };
    }

要实现public UserDetails loadUserByUsername(String username)方法,通过username查找UserDetails对象。

密码加密

总所周知,密码不能直接以明文的方式存储在数据库中,否则黑客或者内部工作人员盗走数据库,将是灾难性的。之前大部分系统都使用md5加密算法。目前Spring Security建议使用bcrypt加密算法。增加如下配置:

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

一切看起来非常简单,但是好像目前流行密码加盐的salt技术,居然被大名鼎鼎的Spring Security忽略了?当然不会了!

之前处理salt的方式都是在用户表中使用一个独立的字段,保存一个随机的salt,每次加密解密时,带上这个字段。虽然解决了彩虹表破解的问题,却增加了系统的复杂度。

Spring Security将salt和password合并在一起,保存到password一个字段里面,使得加salt变成一件无感知的事情,丝毫不增加系统的复杂度。看到这个设计时,让我这个多年的shiro用户感觉到,Spring Security确实有点东西。

总结

至此,用户登录问题已基本解决。虽然离灵活使用还有很大距离,但毕竟已经迈出了伟大的一步。

QQ咨询
电话
微信
微信扫码咨询