Предварительная аутентификация Spring Security для режима разработки

StackOverflow https://stackoverflow.com/questions/1067869

  •  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?

Конечно, еще одной проблемой является отсутствие этой функциональности в производственных средах.Всегда рискованно иметь разную кодовую базу для разработчик и подталкивать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top