但在實現上卻出現了問題,首先,系統裡其他業務裡已經出現了以使用者編號為key的redis快取,如果以使用者編號清除,會不會影響其他業務?其次,還有個更嚴重的問題:假如有a和b兩個裝置登入了小明的賬戶,其中小明在a裝置上修改了密碼,此時redis被清空,但小明又在a裝置上重新登入,此時redis中又存入了以小明使用者編號為key的值,b裝置去訪問其他功能的介面,由於不同裝置key沒有區分,都是小明的使用者編號,所以到了過濾器裡仍然能通過redis校驗,去訪問其他介面服務,而不會被退出登入。
為了解決這兩個問題,我首先把key的生成規則做了改變,原來key=usernbr,現在加上表示渠道的字串,後面再加上隨機生成的uuidstr,比如這個用於修改密碼場景,key=「change_pwd_」+usernbr+"_login_"+uuidstr。這樣就不會與其他業務的redis的key值弄混,
同時引入token,即在登入之後會返回乙個唯一的logintoken,這個logintoken的值即為redis的key,**片段如下:
string uuidstr=uuid.randomuuid().tostring().replaceall("-", "");
string logintoken="change_pwd_"+user.getnbr()+"_login_"+uuidstr;
redisservice.addtoredisstring(logintoken, uuidstr);
resmodel.setlogintoken(logintoken);
使用者每次請求其他介面都會把這個logintoken作為引數傳過來。我在介面***裡會做校驗。**片段如下:
/**獲得解密報文交易編號*/
string transcode = securitymodel.gettranscode();
/**交易編號不為登入交易時*/
if (stringutil.isnotempty(transcode) && !stringutil.equals("syslogin", transcode) )
/**logintoken為空或者value為空時,向前端拋異常*/
if (stringutil.isempty(basereqmodel.getlogintoken())
|| stringutil.isempty(logintokenvalue))
}
這樣也確保每台裝置登入產生的key值是唯一的,每台裝置的請求因為引入了logintoken,所以也是不同的,此時只要在修改密碼時,清除redis裡以"change_pwd_"+user.getnbr()+"_login_"開頭的所有key即可。**片段如下:
string loginkey="change_pwd_"+user.getnbr()+"_login_";
redisservice.deletesimilarstringbykey(loginkey);
關於app的登入退出內容
這裡是確認下次跳轉會直接跳過登入介面 if nsuserdefaults.standarduserdefaults boolforkey isok let logon uistoryboard name main bundle nil instantiateviewcontrollerwithide...
redis如何修改登入密碼?設定的密碼為什麼無效?
一 修改登入密碼 1.首先開啟redis.conf 或者叫redis.windows.conf 用編輯器編輯,找到 requirepass foobared 把requirepass前面的 和空格去掉,把 foobared 改為自己想寫的密碼比如123 2重啟伺服器,就可以了,但有陷阱,如果以錯的方...
harbor的加密機制與後台修改登入密碼
參考 很久沒寫部落格,也是沒時間寫,因為平時工作忙,也沒什麼時間寫部落格,今天剛好抽點空,哈哈。我們公司由於要做應用docker化,所以免不了要用harbor來儲存docker映象,比較方便。然而我們設想一下,如果哪天你的web登入密碼忘了,而管理員的web登入密碼也忘了,那該如何修改密碼呢?毫無疑...