如何在Spring Security中获取GET参数?

时间:2012-08-07 22:04:44

标签: spring login parameters get spring-security

我正在使用Spring Security 3.1,我希望在用户登录之前获取来自URL的参数。所以我希望访问我的登录页面的用户向我发送一个redir参数(包含他希望在经过身份验证后访问的URL)。当我请求页面时,而不是当我尝试提交表单进行登录时。

例如:localhost / myApp?redir = my.app.com / custom

如何从URL获取redir参数?

我尝试了几件事,包括重写SimpleUrlAuthenticationSuccessHandler并调用request.getParameter(“redir”),但它返回null。我还尝试实现自己的过滤器UsernamePasswordAuthenticationFilter并在attemptAuthentication上调用getParameter(),但返回null。

更新其他信息: 我的登录页面相当简单,基本上是:通过POST方法调用/ j_spring_security_check的表单(带有j_username和j_password参数)。

我的身份验证提供程序实现了AuthenticationManager,因此在用户进行身份验证后,将返回Authentication对象,其中包含授权列表,用户和密码。

我还实现了SimpleUrlAuthenticationSuccessHandler,onAuthenticationSuccess()方法将检查他的权限,如果经过身份验证和许可,用户将被重定向到他通知URL的页面(现在,当我尝试在此处调用request.getParemeter(“redir”)时方法,我得到null。

public class GetURLFilter extends UsernamePasswordAuthenticationFilter{
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
        throws AuthenticationException {

    String paginaRedirecionar = request.getParameter("redir");
    request.getSession().setAttribute("redirecionamento", paginaRedirecionar);

    return super.attemptAuthentication(request, response);
}
}

<bean id="authenticationFilter"
    class="com.uolinc.adm.security.GetURLFilter"
    p:authenticationManager-ref="radiusAuthenticationManager"
    p:authenticationFailureHandler-ref="radiusAuthenticationFailureHandler"
    p:authenticationSuccessHandler-ref="radiusAuthenticationSuccessHandler" />

<security:http auto-config="false"
    use-expressions="true"
    access-denied-page="/auth/denied" entry-point-ref="authenticationEntryPoint"
    disable-url-rewriting="true"
    access-decision-manager-ref="accessDecisionManager">

    <security:logout logout-url="/auth/logout" logout-success-url="/auth/login" />

    <security:custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter" />
</security:http>

谢谢

1 个答案:

答案 0 :(得分:3)

在登录表单的提交期间调用

UsernamePasswordAuthenticationFilterSimpleUrlAuthenticationSuccessHandler,这是与呈现表单的请求不同的请求。因此,当您提交表单时,在表单请求期间出现的参数将不存在。您需要在会话中缓存该参数,或将其作为隐藏参数添加到登录表单中,以便使用正常登录参数重新提交(以便它可供您的AuthenticationSuccessHandler使用)。

请注意,以这种方式使用客户端提供的数据进行重定向是有风险的,除非您进行某种验证(例如,检查该URL是否在您的应用中)。否则,攻击者可以提供链接到恶意站点的URL,并且可能无法在用户不知情的情况下劫持经过身份验证的会话或在安全站点上执行操作。