gpt4 book ai didi

java - Spring Security不通过Spring Session EnableRedisHttpSession重用身份验证数据

转载 作者:行者123 更新时间:2023-12-01 11:42:53 29 4
gpt4 key购买 nike

我可以使用https://github.com/dsyer/spring-security-angular/blob/master/vanilla/README.md中的示例Spring Boot Groovy Maven实现成功运行此配置。当应用程序代码在Java和Gradle 2.3中实现时,它不起作用。在这种情况下,OPTIONS响应具有新的X-Auth-Token。

尝试将提供的maven构建与我的java类一起使用,并且仍然得到相同的OPTIONS 401未经授权的响应。因此,这不是Gradle问题。

将两个ResourceApplication Groovy类复制到我的Gradle构建中,并且Angular ui成功获得OPTIONS 200 OK。因此,java中的Spring CORS过滤器存在问题。

我有用于Java和groovy的Gradle插件,sourceCompatibility和
targetCompatibility = 1.7

Java版本“ 1.8.0_31”
Java(TM)SE运行时环境(内部版本1.8.0_31-b13)
Java HotSpot(TM)64位服务器VM(内部版本25.31-b07,混合模式)

开发者控制台日志验证了相同的令牌是从ui服务器发送的,还是由Angle Client接收的,但是报告了CORS错误。

跨域请求被阻止:同源策略禁止读取http://localhost:9000/处的远程资源。可以通过将资源移到同一域或启用CORS来解决此问题。本地主机:9000

@SpringBootApplication
@RestController
@EnableRedisHttpSession
public class AngularDemoApplication {
@RequestMapping("/user")
public Principal user(Principal user) {
return user;
}

@RequestMapping("/token")
@ResponseBody
public Map<String,String> token(HttpSession session) {
logger.debug("********** TOKEN *********** = "+session.getId());
return Collections.singletonMap("token", session.getId());
}

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().logout().and().authorizeRequests()
.antMatchers("/index.html", "/home.html", "/login.html", "/").permitAll()
.anyRequest().authenticated().and().csrf().csrfTokenRepository(csrfTokenRepository())
.and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
}

private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}


private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}

public static void main(String[] args) {
SpringApplication.run(AngularDemoApplication.class, args);
}


}

@SpringBootApplication
@RestController
@EnableRedisHttpSession
public class ResourceApplication {

@RequestMapping("/")
public Map<String,Object> home() {
Map<String,Object> model = new HashMap<String,Object>();
model.put("id", UUID.randomUUID().toString());
model.put("content", "Hello World");
return model;
}


@Bean
public HeaderHttpSessionStrategy sessionStrategy() {
return new HeaderHttpSessionStrategy();
}

public static void main(String[] args) {
SpringApplication.run(ResourceApplication.class, args);
}


}

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class CorsFilter implements Filter {

@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-auth-token, x-requested-with");
if (request.getMethod() != "OPTIONS" ) {
chain.doFilter(req, res);
} else {
}

}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub

}

@Override
public void destroy() {
// TODO Auto-generated method stub

}


}

Groovy版本:

请求方法:OPTIONS
状态码:200 OK

请求标头:
主机:localhost:9000
用户代理:Mozilla / 5.0(Windows NT 6.1; WOW64; rv:36.0)Gecko / 20100101 Firefox / 36.0
接受:text / html,application / xhtml + xml,application / xml; q = 0.9,/; q = 0.8
接受语言:en-US,en; q = 0.5
接受编码:gzip,放气
来源:本地主机:8080
访问控制请求方法:GET
访问控制请求标头:x-auth-令牌,x-请求与
连接:保持活动状态

响应标题:
访问控制允许标题:x-auth-token,x-requested-with
访问控制允许方法:POST,PUT,GET,OPTIONS,DELETE
访问控制允许来源:*
存取控制最大年龄:3600
内容长度:0
日期:2015年3月31日,星期二,21:20:28 GMT
伺服器:Apache-Coyote / 1.1

请求方法:GET
状态码:200 OK

请求标头:
主机:localhost:9000
用户代理:Mozilla / 5.0(Windows NT 6.1; WOW64; rv:36.0)Gecko / 20100101 Firefox / 36.0
接受:application / json,text / plain,/
接受语言:en-US,en; q = 0.5
接受编码:gzip,放气
X-Auth-令牌:80e0c2d2-dab4-435d-886e-ae28bc8e636f
X-Requested-With:XMLHttpRequest

响应标题:
访问控制允许标题:x-auth-token,x-requested-with
访问控制允许方法:POST,PUT,GET,OPTIONS,DELETE
访问控制允许来源:*
存取控制最大年龄:3600
内容类型:application / json; charset = UTF-8
日期:2015年3月31日,星期二,21:20:28 GMT
伺服器:Apache-Coyote / 1.1
严格的运输安全性:max-age = 31536000; includeSubDomains
传输编码:分块
引荐来源:localhost:8080 /
来源:本地主机:8080
连接:保持活动状态

Redis服务器密钥:
1)“ spring:session:expirations:1427838660000”
2)“ spring:session:sessions:80e0c2d2-dab4-435d-886e-ae28bc8e636f”

Java版本:

请求方法:OPTIONS
状态码:401未经授权

请求标头:
主机:localhost:9000
用户代理:Mozilla / 5.0(Windows NT 6.1; WOW64; rv:36.0)Gecko / 20100101 Firefox / 36.0
接受:text / html,application / xhtml + xml,application / xml; q = 0.9,/; q = 0.8
接受语言:en-US,en; q = 0.5
接受编码:gzip,放气
来源:本地主机:8080
访问控制请求方法:GET
访问控制请求标头:x-auth-令牌,x-请求与
连接:保持活动状态

响应标题:
访问控制允许标题:x-auth-token,x-requested-with
访问控制允许方法:POST,PUT,GET,OPTIONS,DELETE
访问控制允许来源:*
存取控制最大年龄:3600
允许:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH
内容长度:0
日期:2015年3月31日,星期二20:50:26 GMT
伺服器:Apache-Coyote / 1.1
严格的运输安全性:max-age = 31536000; includeSubDomains
WWW-Authenticate:基本领域=“ Spring”
X-Auth-令牌:8af7e1f4-e723-4ce6-8d21-54a7b10369f8

Redis服务器密钥:
1)“ spring:session:sessions:8af7e1f4-e723-4ce6-8d21-54a7b10369f8”
2)“ spring:session:expirations:1427836860000”
3)“ spring:session:sessions:c6a6cc31-eddc-40dd-99de-a6e1eecbf519”

最佳答案

在Java中,“!=”运算符与Groovy不同。要进行字符串对象比较,请使用equals方法。即

if( !"OPTIONS".equals(request.getMethod()))   

关于java - Spring Security不通过Spring Session EnableRedisHttpSession重用身份验证数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29379304/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com