我使用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参数将被保留吗?
非常感谢 霍华德
答案 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请求中获得,它们应该是可用的。