以前用shiro做過一個賬號一個角色登錄,這個沒問題。
但是新系統,
一個用戶擁有多個角色,但在登錄時必須選擇其中一個角色(預先檢查然后彈出角色選擇窗)
然后想用Shiro只登錄指定的角色(也就是僅擁有該角色的功能權限)
不知道能否做到?怎么做到的?
uj5u.com熱心網友回復:
在 shiro 登錄校驗的時候,AuthorizingRealm 的 doGetAuthorizationInfo()中 的 AuthorizationInfo 這里是配置當前用戶的相關資訊的AuthorizationInfo物件.addRole(選定的角色);
這樣只添加指定的選定的物件,其他配置不動,
是不是你想要的結果?
uj5u.com熱心網友回復:
我試試樓上的uj5u.com熱心網友回復:
能不能先給用戶登錄某一個角色(一個只有默認選單的角色),
等用戶選擇完他想登的角色,我再用這個角色給他登錄一次。
允許登錄后再次登錄嗎?這要怎么做呢?謝謝
uj5u.com熱心網友回復:
就是加一個default角色,這個role是不用選的,直接默認顯示。
uj5u.com熱心網友回復:
在 shiro 登錄校驗的時候,AuthorizingRealm 的 doGetAuthorizationInfo()中 的 AuthorizationInfo 這里是配置當前用戶的相關資訊的
AuthorizationInfo物件.addRole(選定的角色);
這樣只添加指定的選定的物件,其他配置不動,
是不是你想要的結果?
能不能先給用戶登錄某一個角色(一個只有默認選單的角色),
等用戶選擇完他想登的角色,我再用這個角色給他登錄一次。
允許登錄后再次登錄嗎?這要怎么做呢?謝謝
就是加一個default角色,這個role是不用選的,直接默認顯示。
呦,版主吉祥??
uj5u.com熱心網友回復:
解決了,先讓用戶認證,授權時賦給一個虛擬角色(無任何選單和權限),僅僅用來登入,叫default. 甚至不需要這樣一條角色資料。然后讓用戶選角色。
用Session傳遞用戶所選的角色
LoginController
Long targetRoleId = Long.parseLong(map.get("roleId"));// 選的
subject.getSession().setAttribute("targetRoleId", targetRoleId);//放入SessionMyShiroRealm 的 doGetAuthorizationInfo()
Subject subject = SecurityUtils.getSubject();
Object targetRoleId = subject.getSession().getAttribute("targetRoleId");
// CbStaff cbStaff = (CbStaff) principals.getPrimaryPrincipal();
CbRole cbRole = null;
if (targetRoleId != null)// 指定角色
{
cbRole = roleRepo.getOne(Long.parseLong(targetRoleId.toString()));
authorizationInfo.addRole(cbRole.getRoleCode());
Set<CbRoleResource> resSet = cbRole.getCbRoleResources();
Iterator<CbRoleResource> resIt = resSet.iterator();
while (resIt.hasNext())
{
CbResource res = resIt.next().getCbResource();
if (res.getResourceType() > 1 && StringUtils.isNotEmpty(res.getPermission()))// 子選單
authorizationInfo.addStringPermission(res.getPermission());
}
}
else// 默認角色
{
cbRole = roleRepo.findByRoleCode("default");
authorizationInfo.addRole("default");
}
這樣,甚至可以實作應用內切換角色,各處的權限驗證也是符合所選角色的,我試過了。
uj5u.com熱心網友回復:
我也遇到類似問題了感謝博主寫了這篇帖子,有個問題能解釋一下CbRole這個類嗎,我想了解一下如果指定角色不是null后,是如何操作的uj5u.com熱心網友回復:
厲害,學習了.shiro的多種操作.轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/220940.html
標籤:Java EE
上一篇:2020-11-16:手寫代碼:leetcode第406題。假設有打亂順序的一群人站成一個佇列。 每個人由一個整數對(h, k)表示,其中h是這個人的身高,k是
