Shiro單使用者登入

2021-09-24 13:29:04 字數 2892 閱讀 1078

有這樣乙個需求,兩地同時使用乙個賬號登入,需要將先登入的使用者的session刪除

使用者登入時判斷是否之前改賬號在別的地方登入

若沒有登入,直接進行登入

若有登入,則找到登入的session,給該session做個標記

當之前登入的使用者再次進行操作時,判斷其是否有標記,有則刪除其session,並返回友好提示

/**

* 自定義realm,用於使用者登入的驗證和授權

*/public class myrealm extends authorizingrealm catch (exception e)

return info;

} /**

* 使用者認證方法,在呼叫login方法後,呼叫該方法

*/@override

protected authenticationinfo dogetauthenticationinfo(authenticationtoken token) throws authenticationexception catch (exception e)

if (user == null)

if (user.getisdisable() == 2)

authenticationinfo info = new ******authenticationinfo(user.getusername(), user.getpassword(),

bytesource.util.bytes(user.getsalt()), getname());

// 放到shiro的session中

setsession(loginstring.login_key, user,user.getusername());是乙個常量值,隨意定義即可

return info;

} @override

public void clearcachedauthorizationinfo(principalcollection principals)

@override

public void clearcachedauthenticationinfo(principalcollection principals)

@override

public void clearcache(principalcollection principals)

public void clearallcachedauthorizationinfo()

public void clearallcachedauthenticationinfo()

public void clearallcache()

/*** 初始化shiro的加密方式

*/public void initcredentialsmatcher()

/*** 將特殊資料放入到shiro的session中,讓shiro來進行管理

* * @param key

* @param value

*/private void setsession(object key, object value,string username)

/*** 控制同一使用者只能在乙個地方登入,後登入的使用者會頂掉開始登入的使用者

* 注意:如果使用者量過大時此方法會有效率問題,需要改進

*/for(session oldsession:sessions)}}

} }}

系統的所有返回均為同一實體,將介面的資料放入實體的屬性中即可,這樣方便與前台的對接,參考**如下,這樣返回時可以根據當前的session判斷是否已經被人擠掉了。

package com.neusoft.sensteer.fleet.common.consts;

import org.apache.shiro.securityutils;

import org.apache.shiro.session.session;

/** * 介面返回的封裝物件

*/public class returnbean

public returnbean(t userdata)

public returnbean(string code, string remark)

public returnbean(t exception,string remark)

private void handlesession()}}

public string getcode()

public void setcode(string code)

public string getmessage()

public void setmessage(string message)

public t getuserdata()

public void setuserdata(t userdata)

}

這是一種暴力的獲取方式,若系統使用者量小可以考慮,若百萬千萬級別,還是建議選擇其他方式

/**

* 將特殊資料放入到shiro的session中,讓shiro來進行管理

* * @param key

* @param value

*/private void setsession(object key, object value,string username)

/*** 控制同一使用者只能在乙個地方登入,後登入的使用者會頂掉開始登入的使用者

* 注意:如果使用者量過大時此方法會有效率問題,需要改進

*/for(session oldsession:sessions)}}

} }

shiro單使用者登入實現

1.需求 賬號同一時間只能在一處登入 將之前的使用者踢出 shiro實現策略 獲取當前使用者session列表,直接刪除該使用者的其他登入資訊import org.apache.shiro.session.mgt.eis.sessiondao autowired private sessiondao...

單使用者登入

目的 乙個賬號只能在乙個地方登入,不能同時登入 有兩種處理邏輯 1.a登入後,b不能使用同樣的賬戶進行登入 後台邏輯定義 使用者資料表多新增乙個字段,預設為false,每次使用者發起登入,檢測是否為false,是則可以登入,並設定為true,如果為true,則提示使用者已登入,請換個賬號 2.a登入...

簡單使用者登入系統

view1 1.登入 2.註冊 3.退出 islogin false users 加密def code pwd li pwd list pwd li pwd2 li pwd 1 code pwd for i in range len pwd return code pwd 登入def login i...