2014-08-29 102 views
2

我必須處理由apache shiro保護的應用程序。 我對這個框架很陌生。據我所知,我可以通過subject.isPermitted()檢查單個權利,例如,如何確定一個shiro用戶擁有哪些權限

Subject subject = SecurityUtils.getSubject(); 
[...] 
subject.isPermitted("$RightString"); 

爲了記錄目的,我需要用戶權限的完整列表作爲字符串。我不想重複權利列表並檢查每次,是否subject.isPermitted()true

是否有任何捷徑來解決這個問題?

編輯:

更多信息:

  • 應用是在應用程序上下文一個Spring 4應用
  • 境界被定義爲豆

    <bean id="PRODUCTNAMERealm" class="de.PATHFROMPRODUCT_PRODUCTNAMEJdbcRealm"> 
        <property name="dataSource" ref="dataSource"/> 
        <property name="schema" value="${PRODUCTNAME.schema}"/> 
    </bean> 
    

    ,所以我如果需要可以注入它。

+1

你的境界是什麼? – 2014-08-29 11:14:34

+0

@sallu添加了領域信息。 – 2014-08-29 13:06:42

回答

2

我相信沒有開箱即用的方式來做到這一點,我們通過在會話中註冊用戶權限來解決此問題。我們正在使用自定義域實現,我們的權限存儲在數據庫中。

在我們的自定義領域類:

@Override 
public AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { 
    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); 
    Set<String> permissionsSet = //logic to get the permissions here 

    info.addStringPermissions(permissionsSet); 

    SecurityUtils.getSubject().getSession().setAttribute("permissions", permissionsSet); 
    return info; 
} 

現在檢索權限,只需要調用的事:

SecurityUtils.getSubject().getSession().getAttribute("permissions"); 

另一種方法是,你需要的信息注入您的自定義的境界和讓bean公開getAuthorizationInfo。

@Override 
public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) { 
    return super.getAuthorizationInfo(principals); 
} 

.... 

yourRealm.getAuthorizationInfo(SecurityUtils.getSubject().getPrincipals()).getStringPermissions(); 
+0

如果我正確理解你的話:我必須得到自定義領域類的實現的源代碼(在我的例子中是JdbcRealm的擴展),並且我將有兩個選項 - 如果你的代碼是正確的:a)將權限進入會話,然後從那裏檢索它,並b)你的代碼建議:只需獲得AuthorizationInfo。應該有一個getter。不幸的是我必須等到星期一。但我會檢查出來並讓你知道。 – 2014-08-29 20:41:15

+0

是的。掌握AuthorizationInfo也可以,因爲它有一個getStringPermission方法給你一組所有的權限。然而,在我們的項目中,我們並未使用這種方式。我不認爲有一個簡單的方法來獲取它,因爲這個對象只用於領域,並且它不會直接暴露。 – Wouter 2014-08-30 06:12:43

+0

我現在看到你正在使用spring,所以你也可以注入jdbc領域,並確實獲得AuthorizationInfo對象,爲此調整了我的答案。 – Wouter 2014-08-30 06:18:43

1

在我看來,Shiro只與當前用戶的安全,權限等有關,而不是整個用戶羣。您可以使用標準SQL查詢來檢索用戶權限。

+0

我們確實將用戶權限存儲在數據庫中。所以如果我對用戶的權利感興趣,我可以查詢數據庫。但是我沒有提到的是我正在做這件事的背景或目的。目前,我們在Shiro /集羣場景中出現問題,看起來Shirosession「忘記」了用戶/權利。爲了調試這種情況,我想在某些情況下跟蹤哪些用戶登錄,以及Shiro與這個特殊用戶關聯的權限。某處是我們設置的一個漏洞,目前我不知道在哪裏。 – 2014-09-01 14:38:02

相關問題