Создание пользовательской аутентификации с помощью Acegi / Spring Security - PullRequest
21 голосов
/ 15 января 2009

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

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

Я не уверен на 100%, с чего начать. Какие классы Spring Security мне нужно расширить / реализовать? Я прочитал Справочную документацию и хорошо понимаю концепции, но не совсем уверен, нужен ли мне Фильтр, Провайдер или Менеджер, или где / как именно создать Аутентификация объекты. Я безуспешно пытался расширить AbstractProcessingFilter и / или реализовать AuthenticationProvider , но я просто поймал понимание того, как заставить их все играть красиво.

Ответы [ 3 ]

23 голосов
/ 10 апреля 2009
  1. Реализация пользовательского AuthenticationProvider, который получает всю вашу информацию аутентификации от Authentication: getCredentials(), getDetails() и getPrincipal().

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

<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 реализует стандартную аутентификацию по имени пользователя и паролю.

  3. Настройте Spring Security для добавления или замены стандартного AUTHENTICATION_PROCESSING_FILTER. Для заказов Spring Security Filter см. 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>
1 голос
/ 19 июля 2011

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

1 голос
/ 18 ноября 2010

Вот пример файла конфигурации 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...