Spring Security получает доступ к параметрам запроса и сеансу http в AccessDecisionVoter - PullRequest
1 голос
/ 05 марта 2011

У меня есть класс, который реализует Spring Security (версия 2.5) org.springframework.security.vote.AccessDecisionVoter. Решение о доступе основано на проверке запрошенного идентификатора статьи по списку идентификаторов, хранящихся в сеансе http пользователей, если идентификатор существует, я верну ACCESS_GRANTED.

Но как мне получить параметры запроса и информацию о сеансе пользователя из метода vote() accessDecisionVoter?

Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

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

  • Объект аутентификации должен содержатьGrantedAuthorities
  • Защищаемый объект должен быть вашей статьей
  • Атрибуты Config в значительной степени должны быть любой дополнительной информацией, используемой для принятия решения

В вашем случае (опять же, незная много о дизайне вашей системы), я бы либо пошел за создание чего-то вроде

public class SpecificArticlesGrantedAuthority implements GrantedAuthority {
  private final Collection<Integer> grantedArticleIds;

  //Constructor

  //Getter for the IDs
}

и удержал бы это в вашем объекте аутентификации.

В качестве альтернативы используйте PermissionEvaluator, а не AccessDecisionVoter, которая лучше подходит для ACL-подобной функциональности (но доступна только с Spring 3.0)

1 голос
/ 05 марта 2011

Вероятно, лучший и более чистый способ сделать это - создать свой собственный фильтр (который будет иметь легкий доступ к объекту запроса), который добавляет ACCESS_GRANTED GrantedAuthority для этого пользователя.

0 голосов
/ 25 июля 2016

При реализации из AccessDecisionVoter<FilterInvocation> вы можете получить это так:

public class MyAccessDecisionVoter implements AccessDecisionVoter<FilterInvocation> {
    @Override
    public boolean supports(ConfigAttribute attribute) {
        return false;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    public int vote(Authentication authentication, FilterInvocation fi, Collection<ConfigAttribute> attributes) {
        int result = ACCESS_ABSTAIN;

        HttpSession session = null;

        try {
            session = fi.getRequest().getSession(false);
        } catch (UnsupportedOperationException e) {}

        if (session != null) {
            if (sessionAttributeListContainsArticleID) {
                result = ACCESS_GRANTED;
            }
        }

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