網站自動登陸功能的設計

        網站的自動登陸一直都是有利於提升用戶體驗的功能,若是設計很差,也很是容易泄漏用戶的帳戶信息。 java

        比較常見的功能實現方案是將用戶的登陸信息保存在瀏覽器的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 days
cookieToken.setPath("/");
response.addCookie(cookieToken);

        

        當用戶登陸咱們的網站後,到瀏覽器中查看Cookie信息,就會發現有token的記錄: 服務器



        此時token的值就是上面代碼中通過MD5加密的值,做用域名爲咱們的網站域名(這裏是測試環境,因此此處的域名是localhost),有效路徑爲/,即根目錄,有效期到2013年12月27號。 cookie

        根據瀏覽器管理Cookie的機制,當用戶退出登陸後再次瀏覽咱們的網站時,瀏覽器在向服務器發送URL的同時,依舊會帶上Cookie的信息,以下圖中所示: app



        下面是在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();				// 刷新token
			createSession();				// 建立Session
			return "redirect:/user/list";
		}
	}
	return "admin/login";
		
}


        瀏覽器在請求登陸界面的時候,會帶上token,這時候服務器端的程序會拿到這個token,若是token存在且不爲空,會將它與存放在數據庫中的token進行比較,若一致,則經過驗證,登陸成功;若不一致,則登陸失敗。 測試

        驗證成功: 更新token,也就說一個token只能登陸驗證一次,驗證成功後,就會更換新的token

        驗證失敗: 跳轉到登陸頁面 

        對於大部分的網站來講,這樣的設計基本上可以保證用戶的帳戶安全,若要求安全性再高一點,能夠同時加入對訪問ip的驗證,這樣驗證機制就是token + ip雙重驗。不足之處就是ip獲取的準確性不夠,若用戶以前使用了代理訪問,那麼先後ip就出現了不一致,沒法自動登陸。

相關文章
相關標籤/搜索