在Spring Boot中是否有一种方法来限制对某个端点的访问,除非提交了来自前一页的表单?



下面是我的Spring Boot应用程序的正常行为:

登录页面,用户可以在其中填写一般信息表单(http://localhost:8085/customers/generalInfo/)。提交后,用户被重定向到财务详细信息页面(http://localhost:8085/customers/financialDetails),在那里他可以填写另一个表单并提交结果。

我的Controllers类如下:

GeneralInfoController.java

@Controller
@RequestMapping("/customers/generalInfo")
public class CustomerController {
@GetMapping
public String openCustomerForm(Model model) {
model.addAttribute("mainContact", new MainContact());
return "general-info"; // general-info.html
}

@PostMapping("/saveInfo")
public String saveCustomerForm(@Valid MainContact mainContact, Model model) {
/*
*  something
*/
return "redirect:/customers/financialDetails";
}
}

financialDetailsController.java

@Controller
@RequestMapping("/customers/financialDetails")
public class CustomerController {
@GetMapping
public String openFinDetailsForm(Model model) {
model.addAttribute("financialDetails", new FinancialDetails());
return "financial-details"; // financial-details.html
}

@PostMapping("/saveFinancialDetails")
public String saveFinancialForm(@Valid FinancialDetails financialDetails, Model model) {
/*
*  something
*/
return "redirect:/done";
}
}

我的问题是,我可以通过http://localhost:8085/customers/financialDetails访问财务详细信息表,甚至不填写一般信息表,这是完全预期的。但在我的例子中,我不希望用户访问"财务详细信息"页面,除非填写并提交了"一般信息"表单。

我尝试使用Spring-boot的安全性。如果我明确授权某些端点(这意味着默认情况下所有其他端点都受到限制),则"/customers/financialdetails";即使提交之前的表单,也无法访问端点。(预期行为)

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()
.antMatchers("/customers/generalInfo",
"/assets/**",
"/common/**",
"/images/**",
"/js/**",
"/styles/**")
.permitAll()
.anyRequest().authenticated();
}
}

换句话说,我不希望这个应用程序的用户能够通过输入URL直接从浏览器访问第二个表单。他应该有权访问"/客户/一般信息";并被重定向到"/customers/financialdetails";只有在填写并提交表格时才可以。这在春靴中还能实现吗?

首先,在提交表单并重定向到财务

之前,确保用户信息页面上的每个字段都应该填写好。生成一个ID以及用户详细信息页面,如果用户详细信息页面已填写并提交,则可以在数据库中生成该ID。

然后将该ID作为财务详细信息的URL中的参数传递,并在控制器中将其作为请求参数,将其置于是否为null的条件中,然后通过重定向传递或在没有用户详细信息的情况下访问失败。

最新更新