Как правильно использовать 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, чтобы определить, разрешен ли метод.