Spring Security 3.1.3请求查询字符串被剥离

时间:2014-02-02 11:27:05

标签: java spring-security

我使用Spring Security 3.1.3保护我的应用程序,并且我要求用户通过第三方应用程序中的链接进行登录。

但是,第三方应用程序中的链接将重定向到特定资源,而不是重定向到登录页面,其中用户希望的资源 访问将被定义为查询字符串参数。因此,例如,链接的形式如下:
//server.com/app/build/panel.jsp?resourceid='blah'

当用户单击此链接时,应将其转到我的Spring Security配置中定义的登录页面,如果经过身份验证,则应重定向 到包含querystring参数的原始链接。 querystring参数不会影响用户的身份验证方式 只是资源的id。

现在,除了查询字符串之外,这一切都运行正常,在进入请求处理流程之前,它被Spring Security剥离。

这显示在 Spring Security ;

的调试输出中
  

org.springframework.security.web.savedrequest.HttpSessionRequestCache:DefaultSavedRequest已添加到Session:   DefaultSavedRequest [http://server.com:8080/app/build/panel.jsp]

即,未保存查询字符串并且已删除resourceid='blah'

注意,我目前正在使用Ant匹配。我没有必要实际匹配查询字符串。

在早期版本的Spring Security中,您似乎可以通过使用BeanPostProcessor来影响此行为, Spring Security - Url with request parameters rules ignored。但方法 DefaultFilterInvocationSecurityMetadataSource.setStripQueryStringFromUrls()已从Spring Security 3.1.3中删除。

如何配置Spring Security以不从原始请求中删除查询字符串?这样当用户在登录后重定向时 原始的URL querystring参数将被保留吗?

非常感谢 霍华德

3 个答案:

答案 0 :(得分:0)

基本上是成功处理程序。

您可以查看此示例:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
      .antMatchers("/login*")
      .permitAll()
      .anyRequest()
      .authenticated()
      .and()
      .formLogin()
      .successHandler(new RefererAuthenticationSuccessHandler());
}

有关它的更多信息:http://www.baeldung.com/spring-security-redirect-login

答案 1 :(得分:0)

你可以从SuccessHandler

获得它

SecurityConfiguration类

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
SuccessHandler getSuccessHandler;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()

    .antMatchers("/dashboard/**",               
            "/feedback/**"
            ).access("hasRole('ROLE_SYSTEM_ADMIN') or hasRole('ROLE_COMPANY_ADMIN')")

    .and().formLogin().loginPage("/login").successHandler(getSuccessHandler)
    .loginProcessingUrl("/login").usernameParameter("ssoId").passwordParameter("password")      
    .and().csrf()
    .and().exceptionHandling().accessDeniedPage("/Access_Denied")
    .and()
    .sessionManagement().invalidSessionUrl("/login").maximumSessions(1).expiredUrl("/login").and().sessionAuthenticationErrorUrl("/login").sessionFixation().migrateSession()
    .sessionCreationPolicy(SessionCreationPolicy.ALWAYS); //always, IF_REQUIRED,never ,stateless    

    http.logout()
    .logoutUrl("/logout")
    .logoutSuccessUrl("/login")
    .invalidateHttpSession(true)
    .permitAll();
}

 @Override
  public void configure(WebSecurity web) throws Exception {
    web
    .ignoring()     
    .antMatchers("/static/**")
    .antMatchers("/images/**");       
     }
}

SuccessHandler类

@Component
public class SuccessHandler implements AuthenticationSuccessHandler {


@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
    Authentication authentication) throws IOException, ServletException {

    HttpSession session = request.getSession();
    response.sendRedirect(request.getContextPath() + "/dashboard/index");
}
}

答案 2 :(得分:0)

对于其他类似问题,请参见链接: https://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html

提取:存在以下危险:当将应用程序部署在不从这些值中剥离路径参数的容器中时,攻击者可能会将其添加到请求的URL中,以使模式匹配成功或意外失败。

但是,这种剥离的目的是要牢固地保护用于登录的模式匹配。这并不意味着查询参数不能从HTTP请求中获得,它们应该是可用的。