我遵循指南:http://spring.io/guides/gs/rest-service/构建我的Rest服务示例,现在我正在尝试启用CSRF保护。我读到它应该默认启用,所以如果我不包括:
http。csrf()。禁用()
在我的websecurityConfigureAdapter
配置中,默认情况下应该启用CSRF保护,但情况似乎并非如此。问题是X-CSRF-TOKEN没有生成,也没有以任何方式包含在我的HTTP响应中。我应该怎么做,生成x-csrf-token并将其包含在响应中,当然,csrf保护完全工作?
我注意到,通过类似的spring mvc配置,我生成了x-csrf-token,其中包括:
在我的安全配置文件中。但是,在Spring启动中,我可能出错了,没有办法生成csrf令牌。有人能帮我吗,也许给我一个工作示例?我的安全配置是:
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
// .csrf().disable()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic()
.authenticationEntryPoint(new RestAuthenticationEntryPoint())
.and()
.formLogin()
.successHandler(new RestAuthenticationSuccessHandler())
.failureHandler(new SimpleUrlAuthenticationFailureHandler())
.and()
.logout()
.logoutSuccessHandler(new RestLogoutSuccessHandler());
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception
{
auth.userDetailsService(restUserDetailService);
}
您可以配置CookieSRFTokenRepository
。将CSRF令牌存储在具有Java配置的Cookie中
@Override
protected void configure(HttpSecurity http) {
http
.csrf(csrf ->
csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
);
}
使用Spring Security 5.3.0。最后,生成CSRF令牌的方法之一是使用下面的代码在cookie中设置它。
http.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
您还需要在服务器授权请求中包含生成的CSRF令牌。
<form>
<input type="hidden" name="_csrf" value="${cookie['XSRF-TOKEN'].getValue()}" />
//Code goes here
</form>
在使用JS框架的情况下,需要通过在请求头中设置令牌来包含令牌。
下面是一个JQuery ajax调用的示例。
// Get the CSRF token from the cookie
const csrfCookie= document.cookie.replace(/(?:(?:^|.*;\s*)XSRF-TOKEN\s*\=\s*([^;]*).*$)|^.*$/, '$1');
// Add the CSRF token to each ajax request header
settings.beforeSend = function(xhr) {
xhr.setRequestHeader('X-XSRF-TOKEN', springCsrfCookie);
};
$.ajax(settings);
还有其他的实现可以满足您的需求,下面的链接由Spring|https://docs.spring.io/spring-security/site/docs/5.3.0.RELEASE/reference/html5/#servlet-csrf
要在CSRF保护中包含CSRF令牌,可以包含CSRFTokenRepository以生成令牌。在您的案例中,添加一条简单的线就足够了:
@Override
protected void configure(HttpSecurity http) throws Exception
{
http.
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) //HERE ! Defaults XSRF-TOKEN as cookie name and X-XSRF-TOKEN as header name
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic()
.authenticationEntryPoint(new RestAuthenticationEntryPoint())
.and()
.formLogin()
.successHandler(new RestAuthenticationSuccessHandler())
.failureHandler(new SimpleUrlAuthenticationFailureHandler())
.and()
.logout()
.logoutSuccessHandler(new RestLogoutSuccessHandler());}
我尝试与使用Laravel构建的REST API对话。但由于令牌不匹配,与邮递员的通话被拒绝。我想我需要在标题中包含CSRF标记。但我需要加密的吗?当我插入这个令牌时,仍然会得到一个错误,即存在令牌不匹配。 我使用以下方法检索令牌: 但每次刷新时都应该改变吗?
JSON WEB TOKEN 生成令牌,扩展 egg 中的 app 对象,使用 app.generateToken() 生成 token const jwt = require('jsonwebtoken'); module.exports = { /** * 生成 Token * @param { Object } params */
配置Spring Security 3.2后,csrf。令牌未绑定到请求或会话对象。 这是Spring Security配置: login.jsp文件 它呈现下一个html: 结果是403 HTTP状态: 在一些调试之后更新,请求对象以良好的形式发出DelegatingFilterProxy,但在CoyoteAdapter的469行中,它执行请求。回收();这会删除所有属性。。。 我使用JDK 1
cmf_generate_user_token($userId, $deviceType) 功能 生成用户 token 参数 $userId: int 用户 ID $deviceType: string 设备类型(mobile,android,iphone,ipad,web,pc,mac,wxapp) 返回 string 生成的用户token
我使用的是一个第三方库,它生成了一个原始的和。 这绕过了我的CSRF保护,并被我的rails服务器击落。 是否有方法在实例化时向的所有实例全局添加预定义的CSRF令牌()?
但是在日志中,我看到CSRF令牌在向/login发布凭据时无效。