Я делаю веб-приложение со 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 с моим текущим решением?
Что более важно, есть ли лучший способ решить эту проблему?
Буду признателен за любую помощь.