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"/>它给注释了,先不适用加密登录,登陆后先创建一个用户,这个用户的密码会加密后保存到数据库,然后在开启加密登录,这时候只有刚创建的这个用户能登录成功,其他的都将登录失败. -
加密的思路:
-
用户注册完成后,数据库保存的是加密后的密码
-
当用户登录时,获取用户输入的真实密码后,会对该密码进行转化,转化成加密算法之后的加密密码
-
框架会比对加密后的密码和数据库存储的加密后的密码进行比对
-
比对成功后用户登录成功
-
注:即使是相同的密码,但是两次保存后,加密后的密码是不同的(MD5)相同
-
猜测:加密后的结果是相同的,只不过框架对加密后的结果进行二次加密(随机算法),才会出现不同的结果,但是这个随机算法是可逆的.框架对二次加密后的密码先用反随机算法,还原成加密后的密码(这个加密是不可逆的,但是相同字符串的加密结果是一样的),然后进行比对,输入密码是否正确.
-