gpt4 book ai didi

spring - 为什么 spring.security.user.name 和密码不适用于通过 Spring Boot 2 使用的 Spring 云配置服务器?

转载 作者:行者123 更新时间:2023-12-05 04:03:12 29 4
gpt4 key购买 nike

我正在尝试保护我的 Spring 云配置服务器。作为第一步,我遵循了非常简单的教程。配置服务器在未经授权的情况下工作正常。但是当我想使用非常简单的基本身份验证时,问题就开始了。我在属性 spring.security.user.namespring.security.user.password 中定义了我自己的用户和密码,但该服务似乎不适用于这些.

当我只保留这些属性并使用默认的“用户”和生成的密码时,一切都很好。我现在被这个问题困扰了一段时间,并试图解决。

这是我的配置服务器 pom.xml 文件的重要部分:

<artifactId>tao-elszamolas-config</artifactId>
<packaging>jar</packaging>

<name>tao-elszamolas-config</name>
<description>Some config service</description>

<parent>
<groupId>com.mycompany.tao</groupId>
<artifactId>tao-elszamolas</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<dependencies>
<!-- Spring Cloud config server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>

<!-- Spring Cloud Eureka client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

这是配置服务器application.yml:

server:
port: 9001

spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: file://${user.home}/application-config
clone-on-start: true
security:
user:
name: configUser
password: configPassword

eureka:
client:
serviceUrl:
defaultZone: http://localhost:9002/eureka/

配置客户端基本上是发现服务。 (我想实现其他微服务使用的发现优先模型。)这是配置客户端服务(在我的例子中是发现服务)的 pom.xml 的重要部分:

<name>tao-elszamolas-discovery</name>
<description>Some service discovery</description>

<parent>
<groupId>com.mycompany.tao</groupId>
<artifactId>tao-elszamolas</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<dependencies>
<!-- Spring Cloud Netflix Eureka service registry server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

<!-- Spring Cloud config client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>

</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

这是配置客户端服务的bootstrap.yml:

spring:
application:
name: discovery-server
cloud:
config:
name: discovery-server
uri: http://localhost:9001
username: configUser
password: configPassword

因此,如果我从配置服务器的 application.yml 中删除用户名和密码,并使用默认的 user 作为用户名,并在 <发现服务器的 strong>bootstrap.yml,然后一切正常。

有谁知道为什么自定义用户名和密码不起作用?

如有任何帮助,我们将不胜感激。我可能犯了一个非常微不足道的错误,只是没有真正认识到它。

最佳答案

更新:

我对 Spring 框架进行了一些调试。我在 spring-security-core-5.1.1.RELEASE.jar 的最新版本中发现了一些非常有趣的事实,更具体地说,在 InMemoryUserDetailsManager 类中。

当在这个类中创建用户时,这个方法被调用:

    public void createUser(UserDetails user) {
Assert.isTrue(!userExists(user.getUsername()), "user should not exist");

users.put(user.getUsername().toLowerCase(), new MutableUser(user));
}

重点应该放在这部分:

user.getUsername().toLowerCase()

因为当它试图为用户更新密码时,它使用了这个方法:

    @Override
public UserDetails updatePassword(UserDetails user, String newPassword) {
String username = user.getUsername();
MutableUserDetails mutableUser = this.users.get(username);
mutableUser.setPassword(newPassword);
return mutableUser;
}

是的,如您所见,updatePassword 方法与类的其余部分不一致,因为它没有将用户名 转换为小写。因此,如果您像这样在属性文件中定义用户,它将永远无法工作:configUser

我在Github上查看了Spring源码后,发现 this .

结论:

问题是用户名而不是密码。如果您想完成这项工作,您有以下选择:

  1. 如果您使用的是 Spring Boot,请使用最新的父版本,即 2.1.1.RELEASE

  2. 如果您坚持使用 spring-security-core-5.1.1.RELEASE.jar,您应该只使用小写的用户名。

关于spring - 为什么 spring.security.user.name 和密码不适用于通过 Spring Boot 2 使用的 Spring 云配置服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53698257/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com