java - Spring Boot 尝试渲染登录处理 url
问题描述
大家好,我正在尝试使用 spring boot 2 和 thymeleaf 3 制作自定义登录表单,应用程序有 2 个安全配置,一个用于移动应用程序用户,另一个用于餐厅,它是一个 Web 应用程序。我正在为餐厅端实现自定义登录表单,但是当登录表单时提交 spring 尝试查找 localhost:8080/{loginprocessingurl} 并导致 404 错误。以下是我的表单、控制器和安全配置:
@Configuration
@Order(2) // no order means order of config value is last
public static class RestaurantSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception{
http.csrf().and()
.antMatcher("/restaurant/**") //antmatcher tekil şekilde urlleri farklı configler için gruplamada kullanılır
.authorizeRequests()
.antMatchers("/assets/**", "/webjars/**","/static/**").permitAll()
.anyRequest().hasRole("RESTAURANT")
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/restaurant/reslogin")
.failureUrl("/restaurant/login?error")
.defaultSuccessUrl("/restaurant/tables",true)
.permitAll()
.and()
.logout()
.logoutUrl("/restaurant/logout")
.deleteCookies("JSESSIONID")
;
}
控制器:
@Controller
@RequestMapping(value="/restaurant")
public class RestaurantController {
@RequestMapping(value="/login",method=RequestMethod.GET)
public ModelAndView getlogin(Model model) {
ModelAndView mav = new ModelAndView();
mav.setViewName("login");
return mav;
}
和我的登录表单:
<form class="mt-5" name="f" th:action="@{/restaurant/reslogin}" method="post">
<!-- <div th:if="${loginError}">
<div class="alert alert-danger">
Invalid username or password.
</div>
</div> -->
<div class="form-group">
<label for="username">Restoran Kullanıcı Adı</label>
<input class="form-control" id="username" name="username" placeholder="Kullanıcı Adı">
</div>
<div class="form-group">
<label for="password">Parola</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Parola">
</div>
<button type="submit" class="btn btn-primary">Giriş</button>
</form>
当我查看源页面时,我看到 thymeleaf 没有注入 csrf 令牌输入。我使用 thymeleaf extras springsecurity 版本 3.0.4,如果我在表单中编写 csrf 输入
<input
type="hidden"
th:name="${_csrf.parameterName}"
th:value="${_csrf.token}" />
,它给我这个错误:EL1007E:在null上找不到属性或字段'parameterName'
事情是我知道spring应该在背面处理登录处理url并进行身份验证(我实现了UserDetailsService并覆盖WebSecurityConfigurationAdapter 的 configureGlobal 方法我是如何正确知道的,因为移动应用程序请求运行良好(另一个 @Configuration 类))而是在成功 url 上重定向我,它尝试呈现该登录处理 url。
另一件事当我不使用自定义登录处理 url 而是使用默认 /login 发布登录表单时,它说 405 方法不允许,但我在网络上尝试的所有其他示例都是这样工作的,甚至在开始 Spring Boot K.Siva Prasad Reddy 的 2 本书,我做了表单登录前。就像我上面所说的那样写,就像魅力一样!每个依赖版本都是一样的!
我一直在处理这 2 天,到处搜索,但找不到解决方案,所以每一个想法和建议都会受到赞赏。
解决方案
我解决了我的问题,这是由于其他配置类中没有相同的 RequestMatcher 造成的,我的错。
http
.antMatcher("/user/**")
因此,如果任何 Spring Boot 爱好者遇到同样的问题,请确保您为单独的 url 映射了 2 个配置。
推荐阅读
- python - 使用 FileHandler 和 dictConfig 进行 Python 日志记录 - 在“文件名”中使用环境变量?
- pandas - Pandas qcut 返回并且 bin 在左边界上显示不一致
- python - 将多级字典展平为单级字典
- zend-framework - Zend Framework 1.12 控制台命令
- php - 我可以在 Windows Server 2019 的 HTML 文件中运行 PHP 代码吗?
- postgresql - uWSGI 和 Postgresql 连接池
- python-3.x - Protobuf RuntimeWarning : Unexpected end-group tag 并非所有数据都已转换
- azure - 具有/不具有跨区域还原的异地冗余恢复服务保管库有什么意义?
- shell - 使用 sed 注释掉 .env 条目
- c - 问题是我最近做的一个算法问题,但我无法得到正确的答案