我有一个带有angular 2前端和spring boot后端的应用程序。 我正在通过遵循一个教程来启用spring boot security csrf,并希望保持这种方式。 但是,当我确实从angular 2应用发布请求以进行用户注册时,我现在面临的问题是我收到403禁止错误。 但是使用登录POST方法可以正常工作。

这是我的Spring Boot安全配置:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

String [] publicUrls = new String [] {
        "/api/public/**",
        "/api/login",
        "/api/logout",
        "/api/register",
        "/api/register/**"
};

@Value("${jwt.cookie}")
private String TOKEN_COOKIE;

@Bean
public TokenAuthenticationFilter jwtAuthenticationTokenFilter() throws Exception {
    return new TokenAuthenticationFilter();
}

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Autowired
private CustomUserDetailsService jwtUserDetailsService;

@Autowired
private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

@Autowired
private LogoutSuccess logoutSuccess;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
    authenticationManagerBuilder
            .userDetailsService( jwtUserDetailsService )
            .passwordEncoder( passwordEncoder() );

}

@Autowired
private AuthenticationSuccessHandler authenticationSuccessHandler;

@Autowired
private AuthenticationFailureHandler authenticationFailureHandler;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf()
            .ignoringAntMatchers(publicUrls)
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
            .sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS ).and()
            .exceptionHandling().authenticationEntryPoint( restAuthenticationEntryPoint ).and()
            .addFilterBefore(jwtAuthenticationTokenFilter(), BasicAuthenticationFilter.class)
            .authorizeRequests()
            .anyRequest()
            .authenticated().and()
            .formLogin()
            .loginPage("/api/login")
            .successHandler(authenticationSuccessHandler)
            .failureHandler(authenticationFailureHandler).and()
            .logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/api/logout"))
            .logoutSuccessHandler(logoutSuccess)
            .deleteCookies(TOKEN_COOKIE);

}

}

这是我的控制器:

@RestController
@RequestMapping( value = "/api", produces = MediaType.APPLICATION_JSON_VALUE )
public class UserController {

@Autowired
private UserService userService;
@Autowired
private EmailService emailService;
@Autowired
private AuthorityRepository authorityRepository;
@Autowired
private PasswordEncoder passwordEncoder;

@RequestMapping( method = GET, value = "/user/{userId}" )
public User loadById( @PathVariable Long userId ) {
    return this.userService.findById( userId );
}

@RequestMapping( method = GET, value= "/user/all")
public List<User> loadAll() {
    return this.userService.findAll();
}

@RequestMapping(value = "/register", method = POST)
public ResponseEntity<?> register(User user,HttpServletRequest request) throws UsernameInUseException{

    if (userService.findByUsername(user.getUsername()) != null) {
        throw new UsernameInUseException();
    }

    user.setEnabled(false); 
    user.setAccountNonExpired(true);
    user.setAccountNonLocked(true);
    user.setCredentialsNonExpired(true);
    user.setConfirmationToken(UUID.randomUUID().toString());  
    user.setPassword(passwordEncoder.encode(user.getPassword()));

    return new ResponseEntity<>(user, HttpStatus.CREATED);
}

这是我的angular 2应用程序中的post方法:

login(user) {
const body = `username=${user.username}&password=${user.password}&email=${user.email}`;
const headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
return this.apiService.post(this.config.login_url, body, headers);
}

register(user) {
const body = `username=${user.username}&password=${user.password}&email=${user.email}`;
const headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
return this.apiService.post(this.config.register_url, body, headers);
}

在我的app.codule.ts的angular 2应用程序中,我还添加了这一行

export function xsrfFactory() {
return new CookieXSRFStrategy('myCookieName', 'My-Header-Name');
}
providers:[
     { provide: XSRFStrategy, useFactory: xsrfFactory},
    ]

任何建议和帮助,将不胜感激。

#1楼 票数:0

我发现了一种方法。 尽管不确定它是否安全,但现在它确实成功了。

在配置控制器上

@EnableGlobalMethodSecurity(prePostEnabled = true)

将此行编辑为

@EnableGlobalMethodSecurity

  ask by oxvoxic translate from so

未解决问题?本站智能推荐:

1回复

spring boot angular csrf令牌握手错误

因此,我不断收到有关从前端(角度)到后端(springboot)的请求的错误。 我有一个假设,我没有将它从前端正确发送到后端。 弹簧安全配置: 角度请求: 请求已发送的证明:已发送 csrf 令牌 我还忘记提及的是我收到了 403 错误。 我会感谢每一个支持,但我不想禁用 csrf 令牌,
1回复

没有 Spring Security 的 Spring Boot Web API 上的错误 403

我正在使用以下 POM 配置构建基于 Spring Boot 的 Web API 我构建了很多控制器,但是当我使用不是 HTTP GET 的方法调用它们时,我收到 403 错误, 在网上查看似乎问题源于 csrf 保护,但我不明白为什么启用此保护在我的项目中,如果我没有导入 Spring Boo
1回复

403错误-模态窗口中的CSRF令牌

我正在从事Spring Boot + Bootstrap项目。 我创建了一个模态窗口来确认iten的删除,但是在将Spring Security添加到项目中之后,模态停止了工作。 如何在模式窗口中正确配置CSRF令牌? 我尝试了一些方法,但没有成功。 删除itens时出现以下错误
2回复

即使禁用 csrf,Spring security 403 forbidden 错误也会不断发生

我一直在关注https://programmingtechie.com/2019/11/08/build-a-full-stack-reddit-clone-with-spring-boot-and-angular-part-3/的教程。 出于某种原因,即使我禁用了 csrf, /auth/api
1回复

当我提交 jsf 表单时,应用程序显示 403 错误页面。 为什么这个?

我使用Joinfaces和primefaces用 JSF 编写了一个 Spring 启动应用程序。 我写了注册表并测试了它。 当我使用 POST 方法发送表单时,应用程序给我一个 403 错误。 我怎么解决这个问题? 我的注册页面的 JSF 模板: 我的 JSF 页面的 Java 代码:
1回复

即使禁用 csrf,Spring Boot 也会为 Mobile 请求抛出 403

我有一个简单的 Spring Boot 应用程序,它有一个 POST rest api 方法来注册用户。 当我通过 Postman 对其进行测试时,这非常有效。 但是当我从我的移动应用程序测试它时,这总是抛出 403。这在选项级别失败,因为我没有看到我的后端记录尝试的请求。 对于这个问题,到处给出
2回复

Jhipster 4 Angular 4 ng2-文件上传返回错误403访问CSRF被禁止

ng2-file-upload不会与上传请求一起发送CSRF访问令牌,因此我被禁止403访问,而我的上传请求被立即拒绝。
1回复

使用带有 JWT 的角度和弹簧引导服务的 PUT 请求出现 403 错误

我正在尝试从前端角度应用程序执行 PUT 请求,但 OPTIONS 的飞行前请求失败并给出错误: 从源“http://localhost:4200”访问“https://invoice-backend-heroku.herokuapp.com/api/invoices/5fe8353905df