我们访问一下/user/hello接口,会先重定向到/login接口,这时候会发现在默认的登录页面上多了一个“记住我”功能。
此时如果我们打开 开发者调试工具,并且勾选“记住我”,然后发起请求,这时候我们会在控制台看到remember-me的cookie信息,说明Spring Security已经自动生成了remember-me这个cookie,且表单中的remember-me参数也处于了“on”状态。
也就是说,我们利用简单的几行代码,就实现了基于散列加密方案的自动登录。
三. 散列加密方案实现原理
你可能会很好奇,散列加密方案到底是怎么实现自动登录的呢?别急,接下来 壹哥就为你分析一下散列加密的实现原理。
1. cookie的加密原理分析
我在前面给各位说过,自动登录其实就是将用户的登录信息保存在用户浏览器的cookie中,当用户下次访问时,自动实现校验并建立登录状态的一种机制。
所以在自动登录后,肯定会生成代表用户的cookie信息,但是为了安全,这个cookie肯定不会明文存储,需要把这个cookie进行加密处理,当然也会解码处理。所以接下来我就给各位分析一下这个cookie的加密和解码过程。
首先 壹哥给各位解释一下所谓的散列加密算法,其实质就是把 username、expirationTime、password等字段,再加上自定义的key字段合并起来,在每个字段之间用 “:” 分隔,最后利用md5算法进行哈希运算,这样就可以得到一个加密后的字符串。Spring Security把这个加密的字符串存储到cookie中,作为用户已登录的标识信息。
然后 壹哥 带你看看**Token Based Remember MeServices源码类中的makeTokenSignature()方法,**你会看到散列加密算法的具体加密实现过程,源码如下图所示:
2. cookie的解码原理分析
上面利用MD5进行了加密,用户在下次登录后,肯定需要进行信息的比对,以判断用户信息是否一致。Spring Security是先对cookie中的信息进行解码,然后与之前记录的登录信息进行比对,以此判断用户是否已登录。
Spring Security是在Abstract Remember MeServices类的decode Cookie()方法中,利用Base64对cookie进行解码,如下图所示:
对于以上2个源码方法,我们可以简化抽取出如下两行代码:
//对各字段进行散列加密
hashInfo=md5Hex(username +":"+expirationTime +":"password+":"+key)
//利用base64进行解码
rememberCookie=base64(username+":"+expirationrime+":"&