Предварительная аутентификация Spring Security для режима разработки
-
21-08-2019 - |
Вопрос
При разработке приложения весьма полезно иметь возможность быстро войти в систему под разными пользователями с разными ролями, чтобы увидеть, как приложение представляет себя.
Вводить имена пользователей и пароли — занятие неинтересное и пустая трата времени.Я хотел бы сделать следующее:
- добавить страницу/панель со списком доступных имен пользователей;
- щелчок по имени пользователя создаст событие для системы безопасности Spring, которое позволит распознать пользователя как аутентифицированного без ввода паролей;
- после перехода по ссылке я аутентифицирован как указанный пользователь.
Н.Б.:Пароли хэшируются и передаются в виде обычного текста с использованием форм, поэтому кодирование паролей в ссылках невозможно.
Очевидно эта функция будет присутствовать только во время разработки.
Как я могу этого добиться?
Решение
Я сделал это так для веб-приложения:
У меня есть параметр конфигурации в context.xml
сервера (естественно только на сервере разработки).Этот параметр содержит список имен пользователей и паролей, разделенных запятыми.
На странице входа (jsp(x)) просто добавьте дополнительную форму и кнопку отправки для каждого имени пользователя, а элемент пароля формирует параметр контекста.Поэтому, если пользователь нажимает на эту кнопку, запускается обычный процесс входа в систему с предопределенными данными для входа.
Контекст сервера.xml
...
<Context>
...
<Parameter name="quickLogin"
value="admin:passwd,user:otherPasswd"
override="false" />
</Context>
логин.jspx
...
<!-- Login for debugging purposes -->
<c:forTokens items="${initParam.quickLogin}" delims="," var="loginPassword">
<c:set var="login" value="${fn:split(loginPassword, ':')[0]}" />
<c:set var="password" value="${fn:split(loginPassword, ':')[1]}" />
<form name="debugLogin" action="${form_url}" method="POST" >
<crsf:hiddenCrsfNonce/>
<input type="hidden" name='j_username' value="${fn:escapeXml(login)}" />
<input type="hidden" name='j_password' value="${fn:escapeXml(password)}" />
<input type="submit" value="${fn:escapeXml(login)} login" />
</form>
</c:forTokens>
...
Другие советы
Используйте InMemoryDaoImpl для режима разработки.Очень легко создавать пользователей и пароли, хранящиеся в памяти:
<bean id="userDetailsService" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
<property name="userMap">
<value>
admin=admin,ROLE_ADMIN,ROLE_USER
user1=user1,ROLE_USER
user2=user2,ROLE_USER
</value>
</property>
</bean>
В режиме разработки добавьте это своему провайдеру аутентификации.В рабочей среде замените его соответствующей реализацией DB или LDAP.
Насколько я понимаю, вы хотели бы, чтобы SpringSecurity автоматически аутентифицировал вас, если запрашивается какой-то конкретный URL-адрес (и у вас будет ссылка на этот URL-адрес на вашей панели/странице).
Как насчет написания собственного фильтра:
public class YourSpecialDevelopmentTimeFilter
extends AuthenticationProcessingFilter
implements SyncSecurityFilter
....
это переопределит:
protected boolean requiresAuthentication(
HttpServletRequest request, HttpServletResponse response)
и вернуть true в зависимости от некоторых параметров в request
?
Конечно, еще одной проблемой является отсутствие этой функциональности в производственных средах.Всегда рискованно иметь разную кодовую базу для разработчик и подталкивать.