Методы защиты с помощью Spring Security - PullRequest
2 голосов
/ 08 августа 2011

Для нашего текущего проекта мы интегрируем JSF и Spring Framework.Я хотел бы использовать Spring Security для обработки аутентификации и авторизации.До сих пор я реализовал пользовательские PasswordEncoder и AccessDecisionVoter, которые работают нормально.Сейчас я пытаюсь защитить методы с помощью аннотации @Secured (среди прочих), но не могу заставить ее работать так, как я ожидаю.

Кажется, что аннотация @Secured работаеттолько для методов бина, вызываемых непосредственно из уровня JSF.Вот упрощенный пример:

@Named("foobarBean")
@Scope("access")
public class FoobarBean
{
    @Secured("PERMISSION_TWO")
    public void dummy()
    {
    }

    @Secured("PERMISSION_ONE")
    public String save()
    {
        dummy();
    }
}

Метод save () вызывается из слоя JSF следующим образом:

<h:commandButton id="save" action="#{foobarBean.save}" />

Нашему AccessDecisionVoter затем предлагается проголосовать за PERMISSION_ONE, но не на PERMISSION_TWO.Это работает как задумано (я надеюсь, что нет), или я делаю что-то не так (что это может быть?).

Я бы опубликовал больше кода или конфигурации, но я не уверен, какая часть важна, и я не хочу загромождать этот пост.

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Это простая проблема Proxy AOP! Если вы используете Proxy AOP for Security, прокси-сервер может перехватывать только те вызовы, которые проходят через прокси. Если один метод вызывает другой метод того же компонента напрямую, то нет прокси, который мог бы перехватить этот вызов. - И по этой причине принимается во внимание только аннотация безопасности save().

Одним из решений было бы использование AspectJ AOP вместо Proxy AOP. (Поддерживается также Spring (Security).)

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

Да, так работает AccessDecisionVoter. Он принимает все роли, разрешенные для ресурса (метод в вашем случае), и голосует за эти роли, формируя текущую роль аутентифицированного пользователя. Если Роль совпадает, то предоставляется только разрешение.

В вашем случае единственная роль, определенная для метода save, - это PERMISSION_ONE, поэтому система безопасности будет проверять только эту роль. Если вошедший в систему пользователь имеет эту роль, этот метод будет выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...