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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
21
0
24 871
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
  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 в качестве входных данных.

    Для начала вы можете расширить АннотацияAuthenticationProcessingFilter.

    Вы можете ссылаться на 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>

Я думаю, вам нужно использовать позицию PRE_AUTH_FILTER вместо AUTHENTICATION_PROCESSING_FILTER. Кроме того, вы можете посмотреть это руководство для реализации аутентификации в Google AppEngine: blog.springsource.com/2010/08/02/…

Tal 12.09.2011 11:29

Вот пример файла конфигурации 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>

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

Другие вопросы по теме