1

我有一个应用程序要求用户在 2 种不同的身份验证方法之间进行选择。一种是用户名/密码认证,另一种是用户名/密码/一次性密码。

我已经创建了额外的身份验证提供程序,并且在我的 resources.groovy 中覆盖 daoAuthenticationProvider 提供程序时效果很好,如http://burtbeckwith.com/blog/?p=1090中所做的那样

但是现在当我需要我的身份验证方法与标准 daoAuthenticationProvider 并存时,我有点卡住了。

我知道我在 resources.groovy 中注册了自定义身份验证提供程序和自定义过滤器。问题是我如何让我的自定义过滤器拦截一个 url("redirect /my_auth to the filter")?

4

1 回答 1

1

您可以使用 Config.groovy 中的 filterChain 配置来执行此操作,而不是在 resources.groovy 中注册过滤器。声明 spring security 将在 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'
]

JOOINED_FILTERS是您在第一个映射中声明的所有过滤器的集合。在“/**”下,除了已排除的自定义过滤器之外的所有过滤器都将处于活动状态。同样,在自定义 URL 下,所有过滤器(减去排除的用于其他 URL 的自定义过滤器)都将处于活动状态。这将确保前往customUrlOne的流量将被firstCustomFilter拦截,而前往customUrlTwo的流量将被secondCustomFilter拦截。

于 2012-07-04T20:29:17.873 回答