ssm-security对用户密码加密(数据库加密)

ssm-security对用户密码加密(数据库加密)


  • 再spring-security配置文件中装配BCryptPasswordEncoder

    <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

     

  • 再用户注册后,对用户密码用passwordEncoder.encode(password);进行加密再存入数据库

       @Autowired
        PasswordEncoder passwordEncoder;
    
        @Override
        public void save(SysUser sysUser) {
            String password = sysUser.getPassword();
            String encoderPassword = passwordEncoder.encode(password);
            sysUser.setPassword(encoderPassword);
            userDao.save(sysUser);
        }

     

  • 在重写的loadUserByUsername(username)方法中,设置使用加密登录

        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            //根据用户名获取用户对象
            SysUser sysUser = userDao.findByUsername(username);
    
            if (sysUser != null) {
                //创建角色集合对象
                Collection<GrantedAuthority> authorities = new ArrayList<>();
                //创建临时角色对象
                GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ROLE_USER");
                //对象添加到集合中
                authorities.add(grantedAuthority);
                //参数"{noop}"+ sysUser.getPassword() 表示不使用加密登录
                //参数sysUser.getPassword() 表示使用密码登录
                User user = new User(sysUser.getUsername(), sysUser.getPassword(), authorities);
                System.out.println("user:" + user);
                return user;
            }
            return null;
        }

     

  • 在spring-security.xml中配置,使用加密注册登录,并指定加密方式

    <!--配置登录认证管理器-->
        <security:authentication-manager>
            <!--提供服务类 去数据库查询账户密码-->
            <security:authentication-provider user-service-ref="userService">
                <!--开启加密登录 指定加密类型-->
                <security:password-encoder ref="passwordEncoder"/>
            </security:authentication-provider>
        </security:authentication-manager>
        <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

     

  • [注]:如果之前数据库存放的不是加密的密码,配置完之后,将会登录不进去.为避免这种问题,可以先把
     <security:password-encoder ref="passwordEncoder"/>它给注释了,先不适用加密登录,登陆后先创建一个用户,这个用户的密码会加密后保存到数据库,然后在开启加密登录,这时候只有刚创建的这个用户能登录成功,其他的都将登录失败.

  • 加密的思路:

    1. 用户注册完成后,数据库保存的是加密后的密码

    2. 当用户登录时,获取用户输入的真实密码后,会对该密码进行转化,转化成加密算法之后的加密密码

    3. 框架会比对加密后的密码和数据库存储的加密后的密码进行比对

    4. 比对成功后用户登录成功

    5. 注:即使是相同的密码,但是两次保存后,加密后的密码是不同的(MD5)相同

    6. 猜测:加密后的结果是相同的,只不过框架对加密后的结果进行二次加密(随机算法),才会出现不同的结果,但是这个随机算法是可逆的.框架对二次加密后的密码先用反随机算法,还原成加密后的密码(这个加密是不可逆的,但是相同字符串的加密结果是一样的),然后进行比对,输入密码是否正确.