2012-07-04 50 views
1

我有一个应用程序需要用户在两种不同的验证方法中进行选择。 一个是用户名/密码认证,另一个是用户名/密码/一次性密码。Grails spring安全添加验证方法

我创建了额外的认证供应商,并覆盖在我的resources.groovy DaoAuthenticationProvider的时候提供商时,在http://burtbeckwith.com/blog/?p=1090

但是现在,当我需要我的身份验证方法通过侧与标准DaoAuthenticationProvider的时候住边做它工作得很好我有点卡住了。

我知道我有我的自定义身份验证提供程序和在resources.groovy中注册的自定义过滤器。问题是我如何使URL(“重定向/ my_auth到过滤器”)被我的自定义过滤器拦截?

回答

1

而不是在resources.groovy中注册过滤器,您可以使用Config.groovy中的filterChain配置来执行此操作。声明所有的过滤器弹簧安全将使用在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是集您在第一张地图中声明的所有过滤器。在“/ **”下,除您排除的自定义过滤器以外的所有过滤器都将处于活动状态。同样,在自定义网址下,所有过滤条件将减去为其他网址指定的已排除的自定义过滤条件。这将确保交通要customUrlOne截获firstCustomFilter和交通要customUrlTwosecondCustomFilter被截获。

+0

没有得到这个工作。在resources.groovy中取消注释我的过滤器注册,并添加了上面的代码,获得投诉,我的过滤器在启动期间没有找到(意思是我需要注册它吗?)。 即使我注册了它链路地图发生了什么错误,因为它似乎从来没有打我的自定义过滤器 – Iman

+0

现在我创建了一个替代解决方案,其中我的登录表单发布一个字段的身份验证方法,然后我注册一个过滤器作为authenticationProcessingFilter和在那里根据所提出的认证方法确定要创建什么认证对象。 认证对象如下 布尔支撑物连接到我的认证供应商(类<?扩展对象> authenticationClass){ CustomAuthentication.isAssignableFrom authenticationClass } 但是你的解决方案是更优雅,如果我能得到它的工作:) – Iman