2013-03-12 29 views
0

我想將Apache Shiro封裝在Servlet環境中。我想創建MySecurityUtils並在靜態方法中使用Shiro SecurityUtils.getSubject。我的問題是這是否是在靜態方法中使用SecurityUtils.getSubject方法的正確方法。這會導致多線程servlet環境中的任何問題嗎?封裝Shiro主題

MySecurityUtils.java

import org.apache.shiro.subject.Subject; 
import org.apache.shiro.SecurityUtils; 

public class MySecurityUtils { 

    public static MyUser getUser() { 
     Subject currentUser = SecurityUtils.getSubject(); 
     MyUser myUser = new MyUser(currentUser); 
     ... 
    } 
} 

MyUser.java

public class MyUser { 
    // ... constructors 
    public boolean isPermitted(..) {subject.isPermitted(...)} 
} 

回答

0

索蒂里奧斯的反饋意見後,我改變了我的代碼如下

public class SecurityHelper { 
    public static boolean isAuthenticated(){ 
     Subject currentUser = SecurityUtils.getSubject(); 
     return currentUser.isAuthenticated(); 
    } 
    public static void checkPermission(String permissionCode){ 
      Subject currentUser = SecurityUtils.getSubject(); 
      currentUser.checkPermission(permissionCode); 
    } 
    public static void checkPermission(String... permissionCodes){ 
      Subject currentUser = SecurityUtils.getSubject(); 
      currentUser.checkPermissions(permissionCodes); 
    } 
    ... and so on 

我封裝了所有應用程序邏輯的Helper類。

0

我不明白你爲什麼會想這樣做,但你的問題的緣故,這將是罰款。

在Web上下文中,Shiro的SecurityUtils#getSubject()爲每個請求返回不同的Subject實例。顯然,如果主題已登錄,憑證將通過(從會話)複製到新的實例Subject。您幾乎都是通過在getUser()的每次調用中返回一個新的MyUser實例來做同樣的事情。

但請注意,如果您在同一個請求中調用getUser()兩次,則會得到不同的MyUser實例。但是,內部Subject將是相同的。如果您在MyUser類中執行除授權以外的其他邏輯,則可能會出現問題。

+0

我想添加額外的應用程序特定檢查到MyUser對象。 MyUser將是不可變的,Subject方法的方法將通過delagate方法訪問。我認爲在那種情況下,它會沒事的或? – 2013-03-12 15:10:12

+0

由於您每次都從您的MySecurityUtils類返回一個新實例,因此請注意,如果您需要每次請求獲取用戶多次。您將在不同的'MyUser'實例上運行。 – 2013-03-12 15:26:52