为我的 Spring Boot 应用程序创建一个默认的安全登录页面

Posted

技术标签:

【中文标题】为我的 Spring Boot 应用程序创建一个默认的安全登录页面【英文标题】:Creating a default Security login page for my spring boot application 【发布时间】:2020-03-24 00:29:30 【问题描述】:

我正在开发 Spring Boot 管理服务器,但我想包含一个 Spring Security,使用 Spring Boot Starter 安全依赖项来创建登录页面。当我输入我的凭据用户名和密码时,我得到这个应用程序的错误没有明确的错误映射。从我所见,我尝试包括百里香依赖来解决这个问题,但它没有用。请告诉我我错过了什么。

package com.example.demo;

import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableAdminServer
@SpringBootApplication
public class DemoApplication 

public static void main(String[] args) 
    SpringApplication.run(DemoApplication.class, args);
   

    @Configuration
public static class SecurityConfig extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.formLogin().loginPage("/login.html").loginProcessingUrl("/login").permitAll();
        http.logout().logoutUrl("/logout");
        http.csrf().disable();

        http.authorizeRequests().antMatchers("/login.html", "/**/*.css", "/img/**", "/third-party/**").permitAll();
        http.authorizeRequests().antMatchers("/**").authenticated();

        http.httpBasic();
    

【问题讨论】:

【参考方案1】:

Springboot 管理服务器已经有登录页面,不需要为它创建显式模板。虽然我相信它应该是可定制的,但还没有深入研究它。以下是我使用默认登录页面的 Springboot 管理员的工作解决方案。

主应用类

@EnableAdminServer
@SpringBootApplication
public class AdminApplication 
    public static void main(String[] args) 
        SpringApplication.run(AdminApplication.class, args);
    

Spring 安全配置

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter   
    private final String adminContextPath;
    public WebSecurityConfig(AdminServerProperties adminServerProperties) 
        this.adminContextPath = adminServerProperties.getContextPath();
       
    @Override
    protected void configure(HttpSecurity http) throws Exception     
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");

        http.authorizeRequests()
                .antMatchers(adminContextPath + "/assets/**").permitAll()
                .antMatchers(adminContextPath + "/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                .logout().logoutUrl(adminContextPath + "/logout").and()
                .httpBasic().and()
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .ignoringAntMatchers(
                        adminContextPath + "/instances",
                        adminContextPath + "/actuator/**"
                );
    

在管理服务器上登录的凭据在 application.properties 中定义为

spring.security.user.name=admin
spring.security.user.password=Admin#123

如果有帮助,请告诉我。

编辑:我尝试使用您提供的文件复制场景。是 pom.xml 缺少一些依赖项。解决后,我可以成功登录管理服务器。您可以按如下方式更新您的 pom 并重试。请参考我在 pom.xml 中添加的 cmets

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version> <!-- EspringDev CHANGED this version -->
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>admin</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot-admin.version>2.0.2</spring-boot-admin.version> <!-- EspringDev CHANGED this version -->
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
        </dependency>

       <!-- EspringDev ADDED below 2 dependencies -->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-server-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>io.projectreactor.netty</groupId>
            <artifactId>reactor-netty</artifactId>
            <version>0.8.6.RELEASE</version>
        </dependency>
      <!-- dependencies -->


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-dependencies</artifactId>
                <version>$spring-boot-admin.version</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

【讨论】:

感谢您的回复,在实施您的 Spring Security 配置后,当我插入凭据以登录服务器时,它不会进入 Spring Boot 管理应用程序,而是停留在登录页面上。我尝试制作一个自定义登录页面以查看是否可以解决我的问题,但我遇到了与以前相同的错误,这不是 /error 的显式映射。昨天我尝试了不同的 spring 安全配置,它可以登录到应用程序,但它导致了一个导致错误的注销问题。 我的 spring 管理应用程序只有这 3 个文件,并且运行良好。您能否分享您项目中使用的任何其他配置 Java 类和应用程序属性文件 以上是我项目中的所有文件 好的,谢谢你的文件。它看起来不错,所以应该是轻微的配置错误。我明天一定会调查的。抱歉耽搁了 非常感谢您花时间解决我的问题,非常感谢。我注意到您更改了父版本,我想知道为什么。

以上是关于为我的 Spring Boot 应用程序创建一个默认的安全登录页面的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 中使用 dotenv 文件

Spring Boot 模拟创建的 POST 响应

[翻译]使用Spring Boot进行单元测试

无法在 Spring Boot 项目中自动装配数据源

Spring Boot - WebLogic 上的 Angular 5 集成

使用自签名证书部署Spring Boot应用程序(包括中间CA)