Spring Switching User: разрешить только пользователю с определенной ролью переключаться на другого пользователя с определенными ролями - PullRequest
2 голосов
/ 02 февраля 2012

Я делаю веб-приложение со Spring Security с 3 различными ролями:

  • SuperSupporter
  • DivisionSupporter
  • Клиент

В настоящее время мое приложение позволяет SuperSupporter "выдавать себя за" DivisionSupporter с помощью SwitchUserFilter , чтобы он действовал в качестве этого DivisionSupporter. Это необходимо в случае, если DivisionSupporter встретит некоторые проблемы - и нуждается в поддержке. Это может показаться странным, но это своего рода использование TeamViewer для проверки проблем с компьютером на компьютере друга.

Более того, теперь нам нужно предоставить DivisionSupporter право «выдавать себя за» Клиента, чтобы DivisionSupporter мог «поддерживать» Клиента.

Но меня беспокоит то, что если мы дадим DivisionSupporter право доступа j_spring_security_switch_user, злонамеренный DivisionSupporter может использовать его для олицетворения SuperSupporter (отправив ссылку на ссылку с соответствующим именем пользователя ).

Я подумал о том, как обойти это дело:

 <bean id="switchUserFilter" class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter">
        <property name="userDetailsService" ref="userDetailsService" />
        <property name="switchUserUrl" value="/j_spring_security_switch_user" />
        <property name="exitUserUrl" value="/j_spring_security_exit_user" />
        <property name="targetUrl" value="/checkRole.html" />
     </bean>

В действии /checkRole (которое является targetUrl) я провожу еще одну проверку: если роль пользователя - SuperSupporter, и он кого-то подражает, приложение отправит его на /j_spring_security_exit_user (поскольку SuperSupporter не потребуется олицетворять сам).

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

Я думаю, что SpringSecurity может каким-то образом удовлетворить эти потребности, но все еще не может его найти. Этот способ действительно безопасен? Может ли DivisionSupporter обойтись без SuperSupporter с моим текущим решением?

Что более важно, есть ли лучший способ решить эту проблему?

Буду признателен за любую помощь.

Ответы [ 2 ]

6 голосов
/ 02 февраля 2012

Подход targetUrl - плохая идея, поскольку пользователь может просто проигнорировать перенаправление и запросить другой URL. Вы должны предотвратить неуместные переключатели в первую очередь.

Ваш лучший выбор - настроить attemptSwitchUser на SwitchUserFilter:

protected Authentication attemptSwitchUser(HttpServletRequest request) {
    Authentication switchTo = super.attemptSwitchUser(request);
    Authentication currentUser = SecurityContextHolder.getContext().getAuthentication();
    // Inspect currentUser (e.g. authorities) and switchTo to see if valid combination
    // Raise AuthenticationException if not

    return switchTo;
}

Этот метод вызывается до установки SecurityContext, так что это лучшее место для проверки правильности переключения.

0 голосов
/ 25 июня 2015

Используйте следующий пример , чтобы зарегистрировать пользователя с помощью Spring Security.

В этом разделе устанавливаются основные параметры для применения этой функциональности:

@Bean
public SwitchUserFilter switchUserFilter() {
    SwitchUserFilter filter = new SwitchUserFilter();

    filter.setUserDetailsService(defaultUserDetailsService);
    filter.setTargetUrl("/");
    filter.setSwitchUserUrl("/switchuserto");
    filter.setUsernameParameter("username");
    filter.setExitUserUrl("/switchuserlogout");
    filter.setSwitchFailureUrl("/index");

    return filter;
}

Следующая строка добавляет объект switchUserFilter в HttpSecurity http объект:

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