Можно ли использовать авторизацию на основе компонентов на основе метаданных вместе с Wicket? - PullRequest
2 голосов
/ 09 апреля 2010

Можно ли использовать авторизацию на основе компонентов на основе метаданных?

Калитка в действии дает, например,

@AdminOnly
private class ModeLink extends Link {.....}

Затем реализуйте isActionAuthorized () стратегии авторизации.

Но я чувствую, что нехорошо создавать новые классы для каждой роли.

Есть ли способ сделать это на основе метаданных? Могу ли я добавить некоторые метаданные в компонент, а затем проверить их на основе метода isActionAuthorized() стратегии авторизации?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2010

Вы можете использовать строковые константы для всех ваших ролей и сделать:

@Require(MySession.ADMIN_ROLE)
public class AdminPanel extends Panel {
  // snip
}

public boolean isActionAuthorized(Component c, Action a) {
  // I usually disallow instantiation of pages and rendering of components
  if (c instanceof Page || a == Component.RENDER) {
    Require r = c.getClass().getAnnotation(Require.class);
    if (r != null && !Strings.isEmpty(r.value()) {
      Roles roles = ((AuthenticatedWebSession)Session.get()).getRoles();
      return roles != null && roles.hasRole(a.value());
    }
  }
  return true;
}

Вместо строк вы также можете использовать enum для запрета случайных строк. Просто используйте a.value().name() в этом случае, чтобы проверить роль.

0 голосов
/ 09 апреля 2010

Я полагаю, что предоставил здесь решение на основе метаданных: Авторизация Wicket с использованием MetaDataKey в ответ на ваш вопрос.

Что касается аннотаций, вы можете использовать одну аннотацию, скажем, @RequiresRole, параметризованную, например, с идентификатором роли: @RequiresRole ("admin").

...