Подтвердить что ты не робот

Создание пользовательской аутентификации с помощью Acegi/Spring Безопасность

У меня возникли проблемы с поиском именно того, что мне нужно реализовать, чтобы использовать собственный метод проверки подлинности с моим веб-приложением с помощью Spring Security. У меня есть приложение Grails с плагином Spring Security, который в настоящее время использует стандартную аутентификацию пользователя/пароля с формой браузера. Это работает правильно.

Мне нужно реализовать механизм наряду с этим, который реализует тип аутентификации MAC. Если HTTP-запрос содержит несколько параметров (например, идентификатор пользователя, временную метку, подпись и т.д.), Мне нужно принять эти параметры, выполнить некоторые сравнения хэширования и подписи/отметки времени, а затем аутентифицировать пользователя.

Я не уверен на 100%, с чего начать. Какие Spring классы безопасности мне нужно расширять/внедрять? Я прочитал Reference Documentation и хорошо понимаю понятия, но не уверен, нужен ли мне фильтр или поставщик или менеджер, или где/как именно создать объекты Authentication. Я запутался, пытаясь расширить AbstractProcessingFilter и/или реализовать AuthenticationProvider, но я просто поймал понимание того, как я заставляю их играть хорошо.

4b9b3361

Ответ 1

  • Внедрите пользовательский AuthenticationProvider, который получает всю вашу информацию аутентификации из Authentication: getCredentials(), getDetails() и getPrincipal().

    Свяжите его с вашим механизмом проверки подлинности Spring, используя следующий фрагмент конфигурации:

<bean id="myAuthenticationProvider" class="com.example.MyAuthenticationProvider">
    <security:custom-authentication-provider />
</bean>
  1. Этот шаг является необязательным, если вы можете найти подходящий вариант из стандартных реализаций. Если нет, реализуйте класс, расширяющий интерфейс Authentication, на который вы можете поместить свои параметры аутентификации:

    (e.g. a user identifier, timestamp, signature, etc.)
    
  2. Расширьте пользовательский SpringSecurityFilter, который связывает два вышеуказанных класса. Например, фильтр может получить AuthenticationManager и вызвать authenticate(), используя вашу реализацию Authentication в качестве входных данных.

    Вы можете увеличить AbstractAuthenticationProcessingFilter как начало.

    Вы можете ссылаться на UsernamePasswordAuthenticationFilter, который расширяет AbstractAuthenticationProcessingFilter. UsernamePasswordAuthenticationFilter реализует стандартную аутентификацию Username/Password.

  3. Настройте свою безопасность Spring для добавления или замены стандартного AUTHENTICATION_PROCESSING_FILTER. Для Spring порядков фильтра защиты см. http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#filter-stack

    Вот фрагмент конфигурации для того, как его заменить:

<beans:bean id="myFilter" class="com.example.MyAuthenticationFilter">
    <custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/>
</beans:bean>

Ответ 2

Вот пример файла конфигурации securityContext.xml с использованием настраиваемого autenticationFilter (расширение AUTHENTICATION_PROCESSING_FILTER) и authenticationProvider. Данные аутентификации пользователя предоставляются соединением jdbc. Конфигурация для Spring Security 2.0.x

<?xml version="1.0" encoding="UTF-8"?>

 <sec:global-method-security />

 <sec:http auto-config="false" realm="CUSTOM" create-session="always" servlet-api-provision="true"
  entry-point-ref="authenticationProcessingFilterEntryPoint" access-denied-page="/notauthorized.xhtml"
  session-fixation-protection="migrateSession">
  <sec:port-mappings>
   <sec:port-mapping http="80" https="443" />
  </sec:port-mappings>

  <sec:anonymous granted-authority="ROLE_ANONYMOUS" username="Anonymous" />
  <sec:intercept-url pattern="/**" access="ROLE_ANONYMOUS, ROLE_USER" />

  <sec:logout logout-url="/logoff" logout-success-url="/home.xhtml" invalidate-session="false" />

 </sec:http>

 <bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
  <property name="loginFormUrl" value="/login.xhtml" />
  <property name="forceHttps" value="false" />
 </bean>

 <bean id="authenticationProcessingFilter" class="mypackage.CustomAuthenticationProcessingFilter">
  <sec:custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
  <property name="defaultTargetUrl" value="/" />
  <property name="filterProcessesUrl" value="/logon" />
  <property name="authenticationFailureUrl" value="/loginError.xhtml" />
  <property name="alwaysUseDefaultTargetUrl" value="false" />
  <property name="authenticationManager" ref="authenticationManager" />
 </bean>

 <jee:jndi-lookup id="securityDataSource" jndi-name="jdbc/DB_DS" /> 

 <bean id="myUserDetailsService" class="mypackage.CustomJdbcDaoImpl">
  <property name="dataSource" ref="securityDataSource" />
  <property name="rolePrefix" value="ROLE_" />
 </bean>

 <bean id="apcAuthenticationProvider" class="mypackage.CustomDaoAuthenticationProvider">
  <property name="userDetailsService" ref="myUserDetailsService" />
  <sec:custom-authentication-provider />
 </bean>

 <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
  <property name="providers">
   <list>
    <ref local="apcAuthenticationProvider" />
   </list>
  </property>
 </bean>

</beans>

Ответ 3

Недавно я представил пример приложения, которое выполняет пользовательскую аутентификацию с помощью Spring Security 3. Исходный код здесь. Более подробная информация находится в этом сообщении в блоге.