为我的 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 应用程序创建一个默认的安全登录页面的主要内容,如果未能解决你的问题,请参考以下文章