当前位置: 首页 > 知识库问答 >
问题:

使用Spring Security时出现意外403错误

司空元凯
2023-03-14

这里我有一个表单的html代码。创建事件的表单。它要求用户提供一些信息,然后他必须按下创建按钮。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head th:replace="fragments :: head"></head>
<body class="container">

<nav th:replace="fragments :: header"></nav>

<form method="post">
    <div class="form-group">
        <label>Name
            <input th:field="${event.name}" class="form-control">
        </label>
        <p class="error" th:errors="${event.name}"></p>
    </div>
    <div class="form-group">
        <label>Description
            <input  th:field="${event.eventDetails.description}" class="form-control">
        </label>
        <p class="error" th:errors="${event.eventDetails.description}"></p>
    </div>
    <div class="form-group">
        <label>Contact Email
            <input  th:field="${event.eventDetails.contactEmail}" class="form-control">
        </label>
        <p class="error" th:errors="${event.eventDetails.contactEmail}"></p>
    </div>

    <div class="form-group">
        <label>Category
            <select th:field="${event.eventCategory}">
                <option th:each="eventCategory : ${categories}"
                        th:value="${eventCategory.id}"
                        th:text="${eventCategory.name}"
                ></option>
            </select>
            <p class="error" th:errors="${event.eventCategory}"></p>

        </label>
    </div>

    <div class="form-group">
        <input type="submit" value="Create" class="btn btn-success">
    </div>
</form>

</body>
</html>

这里是我的表单的java代码。


    @GetMapping("create")
    public String displayCreateEventForm(Model model){
        model.addAttribute("title", "Create Event");
        model.addAttribute(new Event());
        model.addAttribute("categories", eventCategoryRepository.findAll());
        return "events/create";
    }

    @PostMapping("create")
    public String processCreateEventForm(@ModelAttribute @Valid Event newEvent, Errors errors, Model model){
        if (errors.hasErrors()){
            model.addAttribute("title", "Create Event");
            return "events/create";
        }
        eventRepository.save(newEvent);
        return "redirect:";
    }

我不知道为什么按下按钮后,它会给我一个错误,比如:

白标签错误页。此应用程序没有/Error的显式映射,因此您将其视为回退。

Tue Dec 29 00:24:57 EET 2020有一个意外错误(type=For的,状态=403)。禁止。

配置类


package com.example.demo.config;

import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;


@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers(
                        "/registration**",
                        "/js/**",
                        "/css/**",
                        "/img/**",
                        "/webjars/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .invalidateHttpSession(true)
                .clearAuthentication(true)
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/login?logout")
                .permitAll();
    }

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

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider auth = new DaoAuthenticationProvider();
        auth.setUserDetailsService(userService);
        auth.setPasswordEncoder(passwordEncoder());
        return auth;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }

}


共有1个答案

巩衡
2023-03-14

正如@dan1在评论部分提到的那样,使用SpringSecurity时,所有表单提交都需要CSRF(除非您禁用它)。要在表单中自动添加csrf令牌,一种简单的方法是使用thymeleaf标签。一旦thymeleaf在表单中检测到其标签,它就会在丢失时在隐藏输入中添加csrf令牌。这是一个例子

<form th:action="@{'your_post_path'}" method="POST" th:object="${yourModelAttributeEntity}">
...
</form>

你可以加其中一个或者两个都加

 类似资料:
  • Spring我是新来的。我试图在我的数据库中添加一个新目标。在我添加spring security之前,它是有效的,但现在如果我单击添加新目标,我有一个问题: 出现意外错误(类型=禁止,状态=403)。被禁止的 我的goat-add.html: WebSecurity配置类: 我的控制器: 我读到这个问题可以是如果不使用csrf,但我不明白我怎么能解决它。 所有代码:https://github.

  • 出现意外错误(类型=禁止,状态=403)。访问被拒绝。当我试图从邮递员或浏览器中访问URL时,我收到了一个错误,即出现了一个意外错误(类型=禁止,状态=403)。访问被拒绝。 1) 网络安全类:- 2) 身份验证筛选器类:- 3)控制器类:- 4) 服务实现类:-

  • 问题内容: 使用pip安装Google App Engine时出错 问题答案: 这是因为PyPI已禁用对API的非HTTPS访问 https://mail.python.org/pipermail/distutils- sig/2017-October/031712.html 作为解决方法,您可以使用

  • 请帮帮我,我对这个很陌生。提前谢了。

  • 问题内容: 我在解析简单的JSON字符串时遇到问题。我已经在JSONLint上检查了它们,它表明它们是有效的。但是当我尝试使用jQuery替代方法解析它们时,出现了以下错误: 注意:我正在使用PHP 对字符串进行编码。 问题答案: 您的数据已经是一个对象。无需解析。javascript解释器已经为您解析了它。