網站自動登入功能(安全-程式碼簡潔)的設計
參考:http://blog.csdn.net/ivon2008/article/details/39899477
網站的自動登入一直都是有利於提高使用者體驗的功能,如果設計不好,也非常容易洩漏使用者的賬戶資訊。
比較常見的功能實現方案是將使用者的登入資訊儲存在瀏覽器的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的機制,當用戶退出登入後再次瀏覽我們的網站時,瀏覽器在向伺服器傳送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(); // 重新整理token
createSession(); // 建立Session
return "redirect:/user/list";
}
}
return "admin/login";
}
瀏覽器在請求登入介面的時候,會帶上token,這時候伺服器端的程式會拿到這個token,如果token存在且不為空,會將它與存放在資料庫中的token進行比較,若一致,則通過驗證,登入成功;若不一致,則登入失敗。
驗證成功: 更新token,也就說一個token只能登入驗證一次,驗證成功後,就會更換新的token
驗證失敗: 跳轉到登入頁面
【對於大部分的網站來說,這樣的設計基本上能夠保證使用者的賬戶安全】,若要求安全性再高一點,可以同時加入對訪問ip的驗證,這樣驗證機制就是token + ip雙重驗。不足之處就是ip獲取的準確性不夠,若使用者之前使用了代理訪問,那麼前後ip就出現了不一致,無法自動登入。
======感覺很值得借鑑。1.使用過濾器,不需要每個頁面都去驗證session,是否登入。===程式碼簡潔
2.每次登陸後更新token(驗證標記),而且token不含使用者詳細資料,經過加密。===安全