gpt4 book ai didi

java - 无法配置 Spring Security 加载 .loginPage ("/login")只有默认页面有效或发送到/templates/index.html

转载 作者:行者123 更新时间:2023-12-01 09:36:15 30 4
gpt4 key购买 nike

我正在尝试使用 Spring BootReactJSSpring Security 设置自定义登录页面。我现在决定在不使用 ReactJS 的情况下实现此功能,并仅使用 Thymeleaf 模板作为登录页面。

如果我没有在我的 Spring SecurityConfiguration 中向 formLogin() 提供 loginPage() 我可以通过默认登录屏幕登录,身份验证在应用程序内进行。

当我尝试在 SecurityConfiguration 中设置自定义登录页面时,问题就出现了,当我转到应用程序时,我无法让它正确加载登录信息。

 .formLogin().loginPage("/login")

当我转到端口 8081 上的默认地址(通过 application.properties 配置)时:

http://localhost:8081/

当我查看源代码时,我将被发送到/templates/index.html而不是login.html

我通过在index.html中添加Spring Security的登录要求来测试这一点

<form th:action="@{/login}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Sign In"/></div>
</form>

这将加载要登录的字段,但我不想让它加载索引,我希望它加载登录。我的问题是为什么它把我发送到index.html而不是login.html?

问题

  1. 我在设置中缺少什么以允许转到login.html 而不是index.html?

这与permitAll()匹配器的设置有关吗?

      .authorizeRequests()
.antMatchers("/", "/built/**", "/main.css").permitAll()

谢谢

下面的代码

Spring 安全配置`

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
private SpringDataJpaUserDetailsService userDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(this.userDetailsService)
.passwordEncoder(PasswordEncoder.PASSWORD_ENCODER);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/built/**", "/main.css").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/#/login") // for reactjs
//.loginPage("/login") // for login.html
.permitAll()
.defaultSuccessUrl("/", true)
.and()
.httpBasic()
.and()
.csrf().disable() // TODO enable for production
.logout()
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
.logoutSuccessUrl("/");
}

}

索引.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>M Cellblock</title>
<!-- cerulean style -->
<link rel="stylesheet" href="https://bootswatch.com/cerulean/bootstrap.css" />
<link rel="stylesheet" href="https://bootswatch.com/cerulean/bootstrap.min.css" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.2/css/font-awesome.min.css" />
<link rel="stylesheet" href="/main.css" />
<link rel="stylesheet" href="/react-date-picker.css" />
</head>
<body>
<div id="react"></div>

<script src="built/bundle.js"></script>

</body>
</html>

登录.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
Invalid username and password.
</div>
<div th:if="${param.logout}">
You have been logged out.
</div>
<form th:action="@{/login}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Sign In"/></div>
</form>
</body>
</html>

最佳答案

第二次尝试

antMatchers("") 规则按照给定的顺序应用,因此,如果您首先允许访问 "/" ,则 all 身份验证是不是必需的,这可能就是加载 index 页面的原因。尝试从 permitAll 列表中删除 "/"。请求除此处所述之外的任何内容都应需要身份验证并重定向到登录页面。

这就是我发布的配置中的完成方式。

第一次尝试

在我的 Vaadin 应用程序中添加:

.exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login/"))

到 HttpSecurity 配置可以完成这项工作(但我也将 servlet 映射到 /login )。

这是我的完整配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/vaadinServlet/**", "/VAADIN/**", "/PUSH/**",
"/UIDL/**", "/login", "/login/**", "/register",
"/environment").permitAll()
.antMatchers("/**").fullyAuthenticated()
.and()
.csrf().disable()
.exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login/"))
.and()
.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}

关于java - 无法配置 Spring Security 加载 .loginPage ("/login")只有默认页面有效或发送到/templates/index.html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38886922/

30 4 0