【问题标题】:Grails Spring Security AbstractPreAuthenticatedProcessingFilter redirectGrails Spring Security AbstractPreAuthenticatedProcessingFilter 重定向
【发布时间】:2013-02-05 13:13:35
【问题描述】:

我正在尝试使用 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)
}

希望对你有帮助

【问题讨论】:

  • 如果您包含 MyAuthenticationService 的源代码会很有帮助

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


【解决方案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"/>

【讨论】:

  • 我定义了一个自定义用户详细信息服务,它实现了 AuthenticationUserDetailsS​​ervice。但由于某些超出我的原因,它给出了..执行引导程序时出错:创建名称为“authenticationUserDetailsS​​ervice”的bean时出错:无法解析匹配的构造函数(提示:为简单参数指定索引/类型/名称参数以避免类型歧义)跨度>
猜你喜欢
  • 2013-03-26
  • 2013-05-12
  • 2015-03-26
  • 2012-12-26
  • 2013-06-21
  • 2011-12-08
  • 2014-01-21
  • 2012-05-18
  • 2011-10-21
相关资源
最近更新 更多