如何使初始登陆页面不是spring security的登录表单?
Posted
技术标签:
【中文标题】如何使初始登陆页面不是spring security的登录表单?【英文标题】:How to make the initial landing page is not the login form from spring security? 【发布时间】:2020-03-06 09:06:14 【问题描述】:目前,我正在使用带有自定义登录页面的 spring-security。每当我启动我的应用程序时,它总是首先登陆我的登录页面,而不是处于未登录状态的主页。我想将我的初始登录页面设置为未登录状态的主页 html 并显示登录按钮。
这是我的 WebSecurityConfig.java
protected void configure(HttpSecurity http)throws Exception
http
.authorizeRequests()
.antMatchers("/css/**").permitAll()
.antMatchers("/js/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login").permitAll();
这是处理登录页面和主页的控制器
@RequestMapping("/")
public String home ()
return "home";
@RequestMapping("/login")
public String login()
return "login";
这是我的 login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home</title>
<object th:include="fragments/fragment :: css" th:remove="tag"></object>
<object th:include="fragments/fragment :: js" th:remove="tag"></object>
</head>
<body>
<div id="login">
<h3 class="text-center text-white pt-5">Halo!</h3>
<div class="container">
<div id="login-row" class="row justify-content-center align-items-center">
<div id="login-column" class="col-md-6">
<div id="login-box" class="col-md-12">
<form id="login-form" class="form" th:action="@/login" method="POST">
<h3 class="text-center text-info">Login</h3>
<div class="form-group">
<label for="username" class="text-info">Username:</label><br>
<input type="text" name="username" id="username" class="form-control">
</div>
<div class="form-group">
<label for="password" class="text-info">Password:</label><br>
<input type="password" name="password" id="password" class="form-control">
</div>
<div class="form-group">
<input type="submit" name="submit" class="btn btn-info btn-md" value="submit">
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
<style>
body
margin: 0;
padding: 0;
background-color: #9be3de;
height: 100vh;
#login .container #login-row #login-column #login-box
margin-top: 120px;
max-width: 600px;
height: 320px;
border: 1px solid #9C9C9C;
background-color: #EAEAEA;
#login .container #login-row #login-column #login-box #login-form
padding: 20px;
#login .container #login-row #login-column #login-box #login-form #register-link
margin-top: -85px;
</style>
这是我的 home.html
<!DOCTYPE html>
<html xmlns:th="http://thymeLeaf.org">
<!-- <html xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity5" xmlns:th="https://www.thymeleaf.org"> -->
<head>
<title> Home </title>
<object th:include="fragments/fragment :: css" th:remove="tag"></object>
<object th:include="fragments/fragment :: js" th:remove="tag"></object>
</head>
<body>
<nav th:replace="fragments/fragment :: navbar"></nav>
<img style="width: 100% ; background-size: cover;" th:src="@/img/webconstruction.png">
</body>
</html>
我的期望是,当您第一次访问该站点时,它将登陆我的 home.html 并且没有登录状态并显示一个登录按钮而不是我的 login.html。我应该如何解决这个问题?
【问题讨论】:
【参考方案1】:您需要通过将模式"/"
配置为permitAll
来允许匿名访问您的主页
注意:如果登录成功默认成功 URL 将为"/"
(上下文根)。您需要覆盖成功网址,否则登录后会再次重定向到主页。
仅举个例子,如果您的登录后屏幕是仪表板,则将成功 url 配置到仪表板,如下面的代码所示。
protected void configure(HttpSecurity http)throws Exception
http
.authorizeRequests()
.antMatchers("/").permitAll() // This will be your home screen URL
.antMatchers("/css/**").permitAll()
.antMatchers("/js/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.defaultSuccessUrl("/postloginscreen") //configure screen after login success
.loginPage("/login")
.permitAll()
.and()
.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login").permitAll();
【讨论】:
以上是关于如何使初始登陆页面不是spring security的登录表单?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 使用非spring默认的登陆页面,是如何跳转到登陆成功页面的?
Spring 3.0 - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/securit
Spring 3.0 - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/securit