网站自动登录功能的设计

来源:互联网 发布:hadoop大数据平台架构 编辑:程序博客网 时间:2024/05/16 19:10

网站的自动登录一直都是有利于提高用户体验的功能,如果设计不好,也非常容易泄漏用户的账户信息。

        比较常见的功能实现方案是将用户的登录信息保存在浏览器的Cookie中。看到一些设计有缺陷的网站会将用户的用户名和密码信息保存在Cookie中,这种做法是相当危险的。虽然这样的设计比较简单,功能比较容易实现,但是却大大提高了泄露用户账户信息的几率,即使保存的用户密码等信息都是经过加密的,但也是不可取的,毕竟现在弱一点的密码加密后也是可以解密的。

        当然自动登录的功能设计必须要在浏览器的Cookie中保留账户的登录凭证(token),这个登录凭证是被当作用户登录的登录钥匙。用户在登录时,凭借浏览器发送的token与服务器端保存的token做比较,若2个token一致,则通过验证,若不一致,则验证失败。

        token的产生最好具有一定的随机性,可以加入日期,随机数等等,然后通过一些不可逆的算法加密,如:

String token = Utils.MD5(user.getUsername() + System.currentTimeMillis());

        样token就不会泄露用户的信息,安全性上得到了保证。token产生后,先将其保存到数据库中,用于以后的验证,接着将其发送给浏览器,保存在客户端的Cookie中。参考代码如下,这里Cookie的有效设置为10天,也就说10后,这个Cookie就会失效:

Cookie cookieToken = new Cookie("token", token);cookieToken.setMaxAge(10 * 24 * 60 * 60); // 10 dayscookieToken.setPath("/");

response.addCookie(cookieToken);

当用户登录我们的网站后,到浏览器中查看Cookie信息,就会发现有token的记录:

        此时token的值就是上面代码中经过MD5加密的值,作用域名为我们的网站域名(这里是测试环境,所以此处的域名是localhost),有效路径为/,即根目录,有效期到2013年12月27号。

        根据浏览器管理Cookie的机制,当用户退出登录后再次浏览我们的网站时,浏览器在向服务器发送URL的同时,依旧会带上Cookie的信息,如下图中所示:

        下面是在Spring MVC框架下用户请求登录页面的实现代码(此处的功能应该加在检测是否登录的Filter中,因为用户的每次请求都会验证用户是否登录,若未登录,即可在验证token,通过token来实现自动登录):

@RequestMapping(value = "/login", method = RequestMethod.GET)public String login(@CookieValue(value="token", required=false) String token) {if (!StringUtils.isEmpty(token)) {if (this.userService.checkToken(token)) {updateCookie();// 刷新tokencreateSession();// 创建Sessionreturn "redirect:/user/list";}}return "admin/login";}

        浏览器在请求登录界面的时候,会带上token,这时候服务器端的程序会拿到这个token,如果token存在且不为空,会将它与存放在数据库中的token进行比较,若一致,则通过验证,登录成功;若不一致,则登录失败。

        验证成功: 更新token,也就说一个token只能登录验证一次,验证成功后,就会更换新的token

        验证失败: 跳转到登录页面

        对于大部分的网站来说,这样的设计基本上能够保证用户的账户安全,若要求安全性再高一点,可以同时加入对访问ip的验证,这样验证机制就是token + ip双重验。不足之处就是ip获取的准确性不够,若用户之前使用了代理访问,那么前后ip就出现了不一致,无法自动登录。


0 0
原创粉丝点击