2013-04-17 2 views
2

Мой бит сеанса имеет несколько методов. Некоторые из них могут быть доступны только ролью ADMIN, другие могут также выполняться ролью USER.Как вызвать метод bean-сессии с определенной ролью при вызове из MDB?

@Stateless 
@DenyAll 
public class MyBean { 
    ... 
    @RolesAllowed({"ADMIN"}) 
    public void foo() { ... } 

    @RolesAllowed({"ADMIN", "USER"}) 
    public void bar() { ... } 
} 

Этот сеансовый компонент вызывается сообщением, управляемым bean-компонентом.

@MessageDriven(...) 
public class MyListener implements MessageListener { 
    public onMessage(Message message) { 
     MapMessage msg = (MapMessage) message; 
     String role = msg.getString("role"); 
     String action = msg.getString("action"); 

     if ("ADMIN".equals(role)) { 
      if ("foo".equals(action)) { 
       // TODO: call as ADMIN role! 
       myBean.foo(); 
      } 
      else if ("bar".equals(action)) { 
       // TODO: call as ADMIN! 
       myBean.bar(); 
      } 
     } 
     else if (role.equals("USER")) { 
      if ("foo".equals(action)) { 
       // TODO: call as USER role! 
       myBean.foo(); 
      } 
      else if ("bar".equals(action)) { 
       // TODO: call as USER! 
       myBean.bar(); 
      }     
     } 
    } 

    @EJB 
    MyBean myBean; 
} 

Поскольку MDB не имеют учетных данных, связанных с ними, я не могу передать безопасность сеансовому компоненту. Сейчас я передаю роль пользователя как часть сообщения. Но как я могу выполнять роль роли, которую я указал?

ответ

1

Вы можете распространять контекст безопасности путем объявления аннотации @RunAs на MDB. К сожалению, вы после объявления роли @RunAs не можете изменить ее программно. Вот пример:

@MessageDriven(...) 
@DeclareRoles("ADMIN") 
@RunAs("ADMIN") 
public class MyListener implements MessageListener { 
} 

Пользователь, который вызывает сессионный компонент из MDB должен быть сопоставлен с предполагаемой ролью:

<security-role-mapping> 
     <role-name>ADMIN</role-name> 
     <principal-name>userCallingFromMDB</principal-name> 
    </security-role-mapping> 

Если вам абсолютно необходимо передать пользователь с несколькими ролями, вы могли бы попытаться создать группу с этими пользователями и использовать @RunAs("GROUP") (я не пробовал это, но представляется возможным из документации.)

Смотрите также эти 2 ссылки: