网站自动登录功能的设计[转]

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

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

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

        

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

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

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

1
2
3
4
Cookie cookieToken = new Cookie("token", token);
cookieToken.setMaxAge(10 * 24 * 60 * 60);   // 10 days
cookieToken.setPath("/");
response.addCookie(cookieToken);

        

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


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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
@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();             // 刷新token
            createSession();                // 创建Session
            return "redirect:/user/list";
        }
    }
    return "admin/login";
         
}

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

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

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

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

原文地址:https://www.cnblogs.com/jessica2015/p/4660757.html