Как правильно использовать isUserInRole (роль)
Чтобы роль пользователя не выполнялась.
- Пример 1: роль "администратор"
это единственная роль, которую можно выполнять
уничтожить действие.
- Пример 2: Любая роль, отличная от "гостя", может выполнять действие CREATE.
В реальном случае у меня есть это:
public String delete() {
if(FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator"){
//.....the action to perform
}
return "Denied";
}
Я бы хотел использовать аннотацию @RolesAllowed()
EJB, но я не использую EJB, а ManagedBeans.
Поэтому возникает вопрос: есть ли способ использовать много ролей одновременно? Некоторое обходное решение!
Пример: если действие должно быть разрешено для 3 ролей (администратор, модератор, менеджер). Я обязан сделать:
if (FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator")
|| FacesContext.getCurrentInstance().getExternalContext().isUserInRole("manager")
|| .....) {
//....
}
И это боль, чтобы воспроизвести все методы. Что-то вроде сотен методов: (
Ответы
Ответ 1
Это нужно контролировать со стороны представления. Разве вы не находите это самим очень раздражающим, когда вы видите на каком-то сайте кнопку, для которой у вас нет достаточных прав на печать, и, таким образом, вы получаете страницу с запугиванием ошибок, когда вы это делаете?
Просто визуализируйте кнопку на стороне просмотра только тогда, когда у пользователя есть требуемая роль, иначе ее полностью скрыть.
<h:commandButton value="Delete" action="#{bean.delete}"
rendered="#{request.isUserInRole('administrator')}" />
Это не чувствительно к (CSRF) хакам, поскольку JSF проверяет условие еще раз во время фазы запроса запроса.
Что касается использования нескольких условий и повторения одного и того же в одном представлении, рассмотрите возможность использования <c:set>
, чтобы дать ему короткий псевдоним. Вы даже можете разместить его в верхней части шаблона мастера, чтобы он был доступен для всех дочерних шаблонов.
<c:set var="isPowerUser" value="#{request.isUserInRole('manager') or request.isUserInRole('administrator')}" scope="request" />
...
<h:commandButton rendered="#{isPowerUser}" />
...
<h:commandButton rendered="#{isPowerUser}" />
Ответ 2
Вы можете сократить это, переместив логику на метод утилиты:
public class AuthorizationUtils {
public static boolean isUserInRoles(String[] roles) {
for (String role : roles) {
if (FacesContext........isUserInRole(role)) {
return true;
}
}
return false;
}
}
И затем вызовите его с помощью:
if (AuthorizationUtils.isUserInRoles(new String[] {"administrator", "moderator"})) {
..
}
Если вы используете CDI, вы можете сделать перехватчик, который обрабатывает аннотацию @RolesAllowed
Ответ 3
@Mediterran81: Итак, в основном вы ищете решение для авторизации bean -метод... как вы создаете управляемый beans? Вы можете представить простой XML-формат: -
<bean class="">
<method name="">
<role> xyz</role>
</method>
</bean>
Попросите этот XML прочитать класс утилиты, и только тогда вам нужно будет вызвать статический метод Utility, чтобы определить, разрешен ли метод.