Polymer UI对接Spring REST API的LDAP身份认证问题
问题分析与解决方案
你的核心问题已经很明确了:跨域AJAX登录请求后,前端没有正确获取并使用新的JSESSIONID。从你提供的请求头对比能看到:
- 前端AJAX登录返回的Set-Cookie是
JSESSIONID=DBCAF4C1FD5D1C1655EFF873B6D556EE,但后续API请求用的却是旧的309D6615798B57247756C33808D57559 - 而同域登录时,浏览器会自动处理302重定向并保存新的JSESSIONID,所以后续请求正常
这是因为跨域场景下,浏览器对AJAX的302重定向处理和同域不同,不会自动保留重定向响应里的Set-Cookie。下面是具体的修复步骤:
1. 修改Spring Security,禁用登录成功后的重定向
默认的表单登录成功后会返回302重定向到首页,这对AJAX场景不友好。我们需要替换成直接返回200成功响应:
protected void configure(HttpSecurity http) throws Exception { http .cors() .and() .authorizeRequests() .antMatchers("/login", "/","/src/**","/bower_components/**", "/oauth/authorize", "/oauth/confirm_access", "/logout", "/oauth/revoke-token","/oauth/check_token").permitAll() .anyRequest().authenticated() .and() .formLogin() .failureHandler(authFailureHandler) // 新增成功处理器,禁用重定向 .successHandler(new SimpleUrlAuthenticationSuccessHandler() { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { response.setStatus(HttpServletResponse.SC_OK); // 可选:返回用户信息,比如JSON格式的用户名 // response.getWriter().write("{\"username\":\"" + authentication.getName() + "\"}"); response.getWriter().flush(); } }) .permitAll() .and() .logout() .permitAll() .and() .rememberMe() .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .and() .exceptionHandling() .and() .csrf().disable() ; }
2. 调整前端iron-ajax的配置
你的with-credentials="true"是正确的,但需要禁止自动跟随302重定向,让前端直接处理登录成功的响应:
<iron-ajax id="login_request" method="POST" url="/login" body='{"username":"xxx", "password":"xxx"}' with-credentials="true" follow-redirects="false" <!-- 新增这个属性,阻止自动重定向 --> on-response="_onLoginSuccess" on-error="_onLoginFailure"> </iron-ajax>
这样前端收到200响应后,浏览器会自动保存Set-Cookie里的新JSESSIONID,后续调用/api/v1/search/draft时,iron-ajax会自动携带这个新的sessionId,后台就能识别已认证的用户了。
3. 额外验证点
- 确认浏览器允许跨域Cookie:对于localhost的不同端口,现代浏览器默认是允许的,但如果后续部署到生产环境,需要确保域名配置符合浏览器的Cookie策略(比如SameSite属性)
- 检查你的CORS配置:当前的
setAllowCredentials(true)和setAllowedOrigins是正确的,不需要修改
为什么直接访问/login页面正常?因为同域下的302重定向,浏览器会自动处理并保存新的JSESSIONID,所有后续同域请求都会携带这个新的sessionId,所以认证状态有效。而跨域AJAX的302重定向,浏览器出于安全考虑,不会自动保留重定向响应的Set-Cookie,所以必须禁用重定向,直接返回成功响应。
内容的提问来源于stack exchange,提问作者vlucian
相关产品推荐
相关产品推荐

