авторизация на компоненте wicket с использованием роли авторизации wicket - PullRequest
4 голосов
/ 24 мая 2011

Я использую калитку 1.4.9 и реализовал роль авторизации spring + wicket и использую @AuthorizeInstantiation на основе ролей на страницах. У меня есть несколько пользовательских ролей.

Я перешел по этой ссылке, чтобы реализовать основы: https://cwiki.apache.org/WICKET/spring-security-and-wicket-auth-roles.html

После этого я реализовал свой собственный UserDetailsService, чтобы иметь свои собственные роли / пользователей из базы данных.

Теперь, как я могу наложить элементы управления на роли с компонентами, например, ссылками, кнопками? лайк Ссылка A доступна только для SUPER_USER, DR_MANAGER. (роли поступают из базы данных).

Я так и сделал, и это похоже на работу, но разве это хороший способ сделать это? OrbitWebSession имеет тип AuthenticatedWebSession.

        @Override
        public boolean isVisible() {
            if(OrbitWebSession.get().getRoles().hasRole("SUPER_USER")){
                return true;
            }
            return false;
        }

спасибо.

Ответы [ 3 ]

7 голосов
/ 04 июня 2011

Переопределение является видимым, все время это большая боль. Взгляните на MetaDataRoleAuthorizationStrategy вместо этого. Вы звоните authorize(Component component, Action action, String roles) с Action RENDER и ролями, которые хотите разрешить. Таким образом, компонент, каким бы он ни был, автоматически скрывается для других ролей при условии, что стратегия авторизации зарегистрирована в вашем веб-приложении. По сути, это то же самое, что и Холмс, за исключением того, что вам не нужно ничего делать подклассом.

3 голосов
/ 24 мая 2011

Вы находитесь на правильном пути, единственное изменение, которое я бы сделал, это:

@Override
public boolean isVisible() {
    return super.isVisible() && OrbitWebSession.get().getRoles().hasRole("SUPER_USER");
}

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

2 голосов
/ 25 мая 2011

Используя аннотацию @AuthorizeAction, вы можете контролировать, отображается ли компонент или нет на основе ролей. Его довольно просто использовать, но вы должны создать подкласс для компонента, который хотите авторизовать.

@AuthorizeAction(action = Action.RENDER, roles = { "SUPER_USER", "DR_MANAGER" })
class UserAdminPageLink extends BookmarkablePageLink<String> {
   //Implementation…
}
add(new UserAdminPageLink("UserAdminPageLink", UserAdminPage.class));

Проверьте Примеры калитки - Авторизация для некоторого рабочего кода.

...