弹簧安全 3.1.3 请求查询字符串剥离

2022-09-01 07:54:04

我正在使用保护我的应用程序,并且我要求允许用户通过第三方应用程序中的链接登录。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,请求参数规则被忽略。但是方法 DefaultFilterInvocationSecurityMetadataSource.setStripQueryStringFromUrls() 已从 中删除。Spring Security 3.1.3

如何配置Spring Security以不从原始请求中剥离查询字符串?那么当用户在登录到原始查询字符串后被重定向时,查询字符串参数将被保留吗?URL

非常感谢霍华德


答案 1

你可以从成功处理者那里得到它

安全配置类

@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/**");       
     }
}

成功搬运工类

@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

基本上是成功处理程序。

你可以看一下这个例子:

@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


推荐