Grails Spring Security AbstractPreAuthenticatedProcessingFilter重定向

时间:2013-02-05 13:13:36

标签: spring spring-security grails-2.0 grails-filters

我正在尝试使用Spring Security Grails插件进行PreAuthentication。我阅读了下面给出的预认证文档,但找不到具体的情况 http://static.springsource.org/spring-security/site/docs/3.0.x/reference/preauth.html

在我的情况下,我们有一个代理程序可以解析SAML请求并在成功验证后提供映射。建议使用这个罐子。因此,我扩展了AbstractPreAuthenticatedProcessingFilter并尝试这样做

@Override 
    protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { 
      userInfo = agent.readToken(request); 
        if (!userInfo){ 
             WebUtils.retrieveGrailsWebRequest().getCurrentResponse().sendRedirect(ssoUrl) 
        } 
        return userInfo 
}

我已将myFilter放在src / groovy下并在BootStrap中注册了此过滤器

def init = { servletContext -> 
        SpringSecurityUtils.clientRegisterFilter( 
                'myFilter', SecurityFilterPosition.PRE_AUTH_FILTER.order) 
} 

它正确加载,但过滤器没有发出重定向。首先,我想检查这是否是正确的方法,如果是,如何重定向工作。

我在grails用户论坛中提出了同样的问题

非常感谢任何帮助。

更新

最终配置对我有用

根据建议编写实现AuthenticationUserDetailsS​​ervice的MyAuthenticationService。您还必须定义包装自定义服务的preAuthenticatedAuthenticationProvider

resources.groovy

securityFilter(MySSOAuthFilters){ bean ->
    authenticationManager = ref('authenticationManager')
    grailsApplication = ref('grailsApplication')
}

customUserDetailsService(MyAuthenticationService)

preAuthenticatedAuthenticationProvider(org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider) {
    preAuthenticatedUserDetailsService = ref('customUserDetailsService')
}

我无法执行<form-login>,因为在Grails中,这是使用完成的 grails.plugins.springsecurity.auth.loginFormUrl配置参数,只接受相对URL。

我最终做的是grails.plugins.springsecurity.auth.loginFormUrl ='/ login / index'

In LoginController

def index() {
    if(springSecurityService.isLoggedIn()){
        log.info("User is logged in")
        return redirect(controller: 'mycontroller', action: 'list')
    }
    log.info("user is not logged in...redirect to sso.")
    return redirect(url: ssoUrl)
}

希望这有帮助

1 个答案:

答案 0 :(得分:1)

我认为有些事情需要改变。

首先,不要在preauth过滤器中发送重定向,只需返回null即可。 preauth过滤器仅用于通过在AuthenticationUserDetailsS​​ervice的实现中实现以下方法来返回AuthenticationUserDetailsS​​ervice可用于创建UserDetails对象的主题。

public UserDetails loadUserDetails(AbstractAuthenticationToken token) {
    return createUserFromSubject((Subject) token.getPrincipal());
}

其次,将表单登录页面设置为配置的一部分。如果没有主题,这将用于重定向。

<form-login login-page="http://url_youwanttoredirect_to_on_auth_req" authentication-failure-url="http://url_youwanttoredirect_to_on_auth_req"/>