Как предоставить роли EJB только определенным сущностям

Мы создаем веб-приложение Java. Мы используем контейнеры EJB и JPA с Wildfly 9.2.

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

Таким образом, у нас будет список разрешений для пользователя, хранящийся в такой таблице:

| User ID | Department | Role    |
| ------- | ---------- | ------- |
| 1       | A          | MANAGER |
| 1       | B          | ADMIN   |
| 2       | B          | MANAGER |

Кроме того, у нас есть глобальные роли. У пользователя есть набор глобальных ролей, которые будут применяться, если в приведенной выше таблице нет записи с рассматриваемым отделом.

| User ID | Role    |
| ------- | ------- |
| 1       | VIEWER  |
| 3       | MANAGER |

Как мы можем легко проверить, находится ли пользователь в определенной роли, заданной отделом?

Просто используя аннотацию @RolesAllowed, мы можем проверить наличие определенной роли, но не ограничиваться отделом.


person Sebastian Häni    schedule 09.02.2017    source источник
comment
Как насчет фильтра? Учитывая URL-адрес, известно ли, к какому отделу (отделам) будет осуществляться доступ по этому URL-адресу? Если пользователь не находится в этих отделах, отклоните запрос. Каким бы ни было решение, что происходит, когда происходит реорганизация и меняются отделы?   -  person Andrew S    schedule 09.02.2017
comment
Или, возможно, перехватчики на уровне EJB.   -  person Andrew S    schedule 09.02.2017
comment
Спасибо вам за ваши предложения. Мы, конечно, рассмотрели это. В настоящее время мы также изучаем Apache Shiro. Это может удовлетворить наши требования.   -  person Sebastian Häni    schedule 15.02.2017


Ответы (2)


Помните, что корпоративные роли безопасности Java связаны с авторизацией.

Таким образом, вы можете смоделировать отдел как роль в вашей системе безопасности. Вполне нормально, если пользователю назначено более одной роли безопасности.

Таким образом, для данного менеджера в отделе B:

@RolesAllowed({"manager", "B"}
public void someBusinessMethod(...) {
     ...
}

Только пользователи, являющиеся менеджерами и работающие в отделе Б, правомочны вызывать этот метод.

person Steve C    schedule 10.02.2017
comment
Спасибо за ваше предложение, но наши отделы динамичны. Поэтому мы не можем жестко закодировать их в наши аннотации. - person Sebastian Häni; 15.02.2017

Оказывается, в EJB нет тех функций, которые нам нужны. Мы перешли на Apache Shiro Security и очень довольны этим.

Разрешения на основе ресурсов всегда должны проверяться программно. Статические проверки на основе ролей и разрешений могут быть аннотациями.

person Sebastian Häni    schedule 02.10.2018