2

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

希望这可以帮助

4

1 回答 1

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"/>
于 2013-02-05T17:12:53.590 回答