2013-03-12 4 views
0

Я хотел бы инкапсулировать Apache Shiro в среду Servlet. Я хочу создать MySecurityUtils и использовать Shiro SecurityUtils.getSubject в статическом методе. Мой вопрос заключается в том, является ли это правильным способом использования метода SecurityUtils.getSubject в статическом методе. Это может вызвать проблемы в многопоточной среде сервлетов?Encapsulation Shiro Subject

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

Я не понимаю, почему вы хотели бы сделать это, но ради вашего вопроса, это было бы прекрасно.

В контексте сети, Shiro's SecurityUtils#getSubject() возвращает другой экземпляр Subject за запрос. Очевидно, что если субъект зарегистрирован, учетные данные будут скопированы (из сеанса) в новый экземпляр Subject. Вы в значительной степени делаете то же самое, возвращая новый экземпляр MyUser при каждом вызове getUser().

Осторожно, если вы позвоните по телефону getUser() два раза с тем же запросом, вы получите другой экземпляр MyUser. Однако внутренний Subject будет таким же. Это может быть проблематично, если вы выполняете логику, отличную от делегирования в своем классе MyUser.

+0

Я хотел бы добавить дополнительную проверку приложения к объекту MyUser. MyUser будет неизменен, и методы метода Subject будут доступны через методы delagate. Я думаю, что в таком случае это было бы хорошо или? –

+0

Поскольку вы возвращаете новый экземпляр каждый раз из своего класса 'MySecurityUtils', будьте осторожны, если вам нужно получить пользователя более одного раза за запрос. Вы будете работать на разных экземплярах MyUser. –