2012-07-04 2 views
1

У меня есть приложение, которое требует от пользователей выбирать между двумя различными методами аутентификации. Один из них - аутентификация имени пользователя и пароля, а другая - имя пользователя/пароль/одноразовый пароль.Grails spring Security add authentication method

я создал дополнительный поставщика проверки подлинности и он работает хорошо, когда переопределение поставщика daoAuthenticationProvider в моем resources.groovy, как это сделано в http://burtbeckwith.com/blog/?p=1090

однако теперь, когда я нужен мой метод аутентификации, чтобы жить бок о бок со стандартной daoAuthenticationProvider я немного застрял.

Я знаю, что у меня есть собственный поставщик аутентификации и настраиваемый фильтр, зарегистрированный в ресурсах.groovy. Вопрос в том, как сделать мой URL-адрес («redirect/my_auth to the filter») перехваченным моим настраиваемым фильтром?

ответ

1

Вместо регистрации фильтров в ресурсах.groovy вы можете сделать это, используя конфигурации filterChain в Config.groovy. Объявите все фильтры весной безопасности будут использовать в filterchain.filterNames, включая как стандартные фильтры, которые вы хотите, а также пользовательских из них:

grails.plugins.springsecurity.filterChain.filterNames = [ 
    'securityContextPersistenceFilter', 'logoutFilter', 
    'authenticationProcessingFilter', 'firstCustomFilter','secondCustomFilter', 
    'rememberMeAuthenticationFilter', 'anonymousAuthenticationFilter', 
    'exceptionTranslationFilter', 'filterInvocationInterceptor' 
] 

Затем сопоставляются пользовательские фильтры для конкретных URL-адресов - один из способов сделать это с использованием исключений выглядит следующим образом:

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/customUrlOne/**': 'JOINED_FILTERS,-secondCustomFilter', 
    '/customUrlTwo/**': 'JOINED_FILTERS,-firstCustomFilter', 
    '/**': 'JOINED_FILTERS,-firstCustomFilter,-secondCustomFilter' 
] 

JOINED_FILTERS является множество всех фильтров вы заявленных в первой карте. В разделе «/ **» будут активны все фильтры, кроме выбранных вами фильтров, которые были исключены. Аналогично, в соответствии с настраиваемыми URL-адресами будут активны все фильтры, минус исключенный настраиваемый фильтр, предназначенный для другого URL-адреса. Это будет гарантировать, что трафик, идущий к customUrlOne будет перехвачена firstCustomFilter, и трафик будет customUrlTwo будет перехвачен secondCustomFilter.

+0

Не получилось, чтобы это сработало. Раскройте мою регистрацию фильтра в ресурсах.groovy и добавьте код, как указано выше, получите жалобу, что мой фильтр не найден во время запуска (имеет смысл, что мне нужно зарегистрировать его правильно?). Даже если я зарегистрирую его, что-то не так происходит в цепочке, поскольку он никогда не попадает в мой настраиваемый фильтр. – Iman

+0

. Теперь я создал альтернативное решение, в котором моя форма входа отправляет поле для метода проверки подлинности. Затем я регистрирую один фильтр в качестве параметра authenticationProcessingFilter и там определяют, какой объект аутентификации должен создаваться на основе предлагаемого метода аутентификации. объекты аутентификации подключены к моему провайдеру аутентификации следующим образом булевы поддерживает (класс authenticationClass) { CustomAuthentication.isAssignableFrom authenticationClass } Однако вы решение гораздо более элегантно, если я могу заставить его работать :) – Iman

Смежные вопросы