如何使初始登陆页面不是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

spring security

Spring Boot确保Web应用安全(登陆认证)

Spring:如何使路由与页面上的 URL 保持同步?