Каков наилучший способ проверить текущие полномочия пользователя в методах контроллера Spring3? - PullRequest
2 голосов
/ 16 августа 2011

Полномочия пользователя часто меняются в моем веб-сервисе.
В этом случае, как мне эффективно проверить полномочия пользователя?

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

Как проверить полномочия пользователя без написания метода проверки на каждом контроллере?

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Не уверен, что вы делаете - Spring Security автоматически отслеживает полномочия в контексте безопасности пользователя.Если вам нужна программная проверка по какой-либо другой причине, то реализуйте интерфейс HandlerInterceptor и в методе preHandle вызовите SecurityContextHolder.getContext().getAuthentication(), чтобы получить текущего пользователя.Затем вы можете проверить полномочия пользователя.

Перехватчик будет настроен следующим образом:

<mvc:interceptors>
    <bean class="com.my.package.MyInterceptor" />
</mvc:interceptors>
0 голосов
/ 17 августа 2011

Используйте HandlerMethodArgumentResolver , чтобы позволить Spring внедрить GrantedAuthority в методе контроллера. Если у пользователя может быть несколько прав доступа, вам потребуется создать класс для хранения прав пользователя (можно назвать GrantedAuthorities). После того, как вы закончите, ваш метод контроллера будет выглядеть примерно так:

@RequestMapping({"/xyz"})
public String handleXYZRequest(GrantedAuthorities authorities) {
    /* use authorities if not null */
    ...
}

В resolver вы будете использовать тот же код, который вы используете в настоящее время для получения прав доступа, и он вернет либо нулевой, либо GrantedAuthorities объект. Если вы используете более старую версию Spring, используйте WebArgumentResolver и зарегистрируйте ее в AnnotationMethodHandlerAdapter.

Приведенный выше подход позволяет избежать дублирования кода и может использоваться для внедрения всего, что вам нужно из SecurityContextHolder в методы контроллера.

Редактировать

Это похоже на подход, используемый теплицей. См. WebConfig , где принципал (который является объектом Account) вводится в контроллер через преобразователь аргументов.

0 голосов
/ 17 августа 2011

Добавьте элемент intercept-url в вашу конфигурацию с требуемой ролью, например.

<http auto-config='true'>
  <intercept-url pattern="/**" access="ROLE_FOO" />
</http>
...