gpt4 book ai didi

java - Spring Security - 无法使用自定义登录页面登录

转载 作者:行者123 更新时间:2023-12-04 07:38:21 25 4
gpt4 key购买 nike

我正在学习 spring,目前正在使用 Spring Security 学习传统的用户/密码身份验证。
目前,如果我让 Spring 使用默认页面登录,我可以毫无问题地做到这一点,但是如果我尝试设置一个自定义登录页面,甚至输入正确的数据(我使用 Inspect 工具确认了这一点),我没有重定向到主页,而是重定向到同一个登录页面,但页面不是“localhost:1812/login”,而是更改为“localhost:1812/login?error”,我无法登录。基本上,我的 WebSecurityConfig 类是:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
System.out.println("ccc");
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
//.formLogin().permitAll()
.formLogin().loginPage("/login").permitAll()
.defaultSuccessUrl("/home", true);

System.out.println("ddd");

}

@Bean
@Override
protected UserDetailsService userDetailsService() {
System.out.println("AAA");
UserDetails user = User.withDefaultPasswordEncoder()
.username("root")
.password("root")
.roles("ADM")
.build();
System.out.println("bbb");
return new InMemoryUserDetailsManager(user);
}
}
如果我使用“.formLogin().permitAll()”而不是“.formLogin().loginPage("/login").permitAll()”,我可以成功登录,但Spring会加载一个标准的登录页面。我想了解可能出了什么问题。在 Inspect 工具上,我在自定义页面上发送登录时收到了 HTTP 状态代码 302,但我不知道这意味着什么......这里我留下我的 LoginController 和 login.html 的代码,如果有人帮助我我会很感激,因为我努力了,但我无法解决问题......
登录 Controller
@Controller
public class LoginController {

@GetMapping
@RequestMapping("/login")
public String login() {
return "login";
}

}
登录.html
<!DOCTYPE html>
<html>
<head th:replace="~{base :: head}"></head>
<body>
<div th:replace="~{base :: logo}"></div>
<div class="container">
<div th:replace="~{base :: titulo('Login')}"></div>
<div class="card mb-3">
<form th:action="@{/login}" method="POST" class="card-body">
<div class="form-group mb-3">
<div class="mb-2">
<label for="username" class="sr-only">Usuário</label>
<input type="text" name="username" class="form-control" placeholder="usuário"/>
</div>
<div class="mb-2">
<label for="password" class="sr-only">Senha</label>
<input type="password" name="username" class="form-control" placeholder="senha"/>
</div>
<button class="btn btn-primary" type="submit">Login</button>
</div>
</form>
</div>
</div>
</body>
</html>
编辑:
在用户@Random Guy 的帮助下,并在 Google 中进行了一些搜索,我将配置方法修改为:
protected void configure(HttpSecurity http) throws Exception {

http
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**","/callback/", "/webjars/**", "/css**", "/error**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.formLogin().loginPage("/login").loginProcessingUrl("/login")
.defaultSuccessUrl("/home").failureUrl("/login?message=error").usernameParameter("username")
.passwordParameter("password").and().logout().logoutUrl("/perform_logout")
.logoutSuccessUrl("/login?message=logout");

}
但是虽然仍然无法登录,但当我输入用户名和密码时,我被重定向到相同的登录页面,但现在的 url 是“http://localhost:1812/login?message=error”,就像在带有“.failureUrl("/login?message=error")”的代码。这是否意味着我的问题出在 html 中?老实说,我不知道...
编辑 2:使用来自 Display error messages in Spring login 的代码
尝试找出我遇到的错误类型,我现在的登录方法是:
@GetMapping("/login-error")
@RequestMapping("/login")
public String login(HttpServletRequest request, Model model) {
HttpSession session = request.getSession(false);
String errorMessage = null;
if (session != null) {
AuthenticationException ex = (AuthenticationException) session
.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
if (ex != null) {
errorMessage = ex.getMessage();
}
}
System.out.println("--->" + errorMessage);
model.addAttribute("errorMessage", errorMessage);
return "login";
}
而且,即使输入正确的凭据,如我在“userDetailsS​​ervice”方法中指定的,我也无法登录,但这次我终于可以在控制台上看到错误消息:
--->User not found or invalid password
显然我走了但没有离开这个地方,因为现在我不知道我的代码有什么问题......

最佳答案

看起来这可能只是一个错字。您的密码字段称为用户名:

<input type="password" name="username" class="form-control" placeholder="senha"/>
将其更改为:
<input type="password" name="password" class="form-control" placeholder="senha"/>
一切都很好。

关于java - Spring Security - 无法使用自定义登录页面登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67630031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com