我正在尝试保护我的Spring云配置服务器。作为第一步,我遵循了教程,这是非常简单的事情。配置服务器在未经授权的情况下工作正常。但是当我想使用一个非常简单的基本身份验证时,问题就开始了。我在属性spring.security.user.name和spring.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
型
所以,如果我从config server的application.yml中删除用户名和密码,并使用默认的user作为用户名,在discovery server的bootstrap.yml中生成的密码,那么一切都可以正常工作。
有人知道为什么自定义用户名和密码不起作用吗?
如有任何帮助,我们将不胜感激。我可能犯了一个很小的错误,只是没有真正认识到它。
1条答案
按热度按时间bpsygsoo1#
更新:
我对Spring框架进行了一些调试。我在最新版本的
spring-security-core-5.1.1.RELEASE.jar
中发现了一些非常有趣的事实,更具体地说,是在InMemoryUserDetailsManager
类中。在此类中创建用户时,将调用此方法:
字符串
重点应放在这一部分:
型
因为当它尝试更新用户的密码时,会使用此方法:
型
是的,正如您所见,
updatePassword
方法与类的其余部分不一致,因为它不将username
转换为 lowercase。因此,如果您在属性文件中这样定义用户,它将永远不会工作:configUser
的值。在我检查了Github中的Spring源代码之后,我发现了下面的提交:
结论:
问题出在用户名而不是密码上。如果你想得到这个工作,你有以下的选择:
1.如果您使用的是
Spring Boot
,请使用最新的父版本,即**2.1.1.RELEASE *1.如果您坚持使用
spring-security-core-5.1.1.RELEASE.jar
,则应仅使用小写用户名。