Мне сложно определить, что именно мне нужно реализовать, чтобы использовать собственный метод аутентификации в моем веб-приложении с помощью Spring Security. У меня есть приложение Grails с плагином Spring Security, которое в настоящее время использует стандартную аутентификацию пользователя / пароля с помощью формы браузера. Это работает правильно.
Наряду с этим мне нужно реализовать механизм, реализующий тип аутентификации MAC. Если HTTP-запрос содержит несколько параметров (например, идентификатор пользователя, отметку времени, подпись и т. д.), Мне нужно взять эти параметры, выполнить некоторое хеширование и сравнение подписи / отметки времени, а затем аутентифицировать пользователя.
Я не уверен на 100%, с чего начать. Какие классы безопасности Spring мне нужно расширить / реализовать? Я прочитал Справочная документация и хорошо понимаю концепции, но не совсем уверен, нужен ли мне фильтр, поставщик или менеджер, или где / как именно создавать объекты Аутентификация. Я напортачил, пытаясь расширить АннотацияОбработкаФильтр и / или реализовать AuthenticationProvider, но меня просто захватило понимание того, как я заставляю их всех играть хорошо.





Внедрите собственный AuthenticationProvider, который получает всю вашу аутентификационную информацию из Authentication: getCredentials(), getDetails() и getPrincipal().
Свяжите его с механизмом аутентификации Spring Security, используя следующий фрагмент конфигурации:
<bean id = "myAuthenticationProvider" class = "com.example.MyAuthenticationProvider">
<security:custom-authentication-provider />
</bean>
Этот шаг не является обязательным, если вы можете найти подходящую из стандартных реализаций. Если нет, реализуйте класс, расширяющий интерфейс Authentication, в который вы можете поместить свои параметры аутентификации:
(e.g. a user identifier, timestamp, signature, etc.)
Расширьте собственный SpringSecurityFilter, который связывает два вышеуказанных класса вместе. Например, фильтр может получить AuthenticationManager и вызвать authenticate(), используя вашу реализацию Authentication в качестве входных данных.
Для начала вы можете расширить АннотацияAuthenticationProcessingFilter.
Вы можете ссылаться на UsernamePasswordAuthenticationFilter, который расширяет AbstractAuthenticationProcessingFilter. UsernamePasswordAuthenticationFilter реализует стандартную аутентификацию по имени пользователя и паролю.
Настройте 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>
Вот пример файла конфигурации 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. Исходный код - здесь. Более подробная информация в это сообщение в блоге.
Я думаю, вам нужно использовать позицию PRE_AUTH_FILTER вместо AUTHENTICATION_PROCESSING_FILTER. Кроме того, вы можете посмотреть это руководство для реализации аутентификации в Google AppEngine: blog.springsource.com/2010/08/02/…