当前位置: 首页 > 知识库问答 >
问题:

为什么是Spring。安全使用者名称和密码不适用于通过Spring Boot 2使用的Spring cloud配置服务器?

长孙诚
2023-03-14

我正在努力保护我的Spring云配置服务器。作为第一步,我遵循了非常简单的教程。配置服务器未经授权即可正常工作。但当我想使用非常简单的基本身份验证时,问题就开始了。我在spring属性中定义自己的用户和密码。安全使用者名字和Spring。安全使用者密码,但该服务似乎无法使用这些密码。

当我只是离开这些属性,并使用默认的“用户”和生成的密码时,那么一切都很好。我已经坚持了一段时间,并试图解决。

下面是我的配置服务器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>

这是配置服务器应用程序。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

所以,如果我从应用程序中删除用户名和密码。配置服务器的yml和我使用默认用户作为用户名,并在引导中使用生成的密码。发现服务器的yml,然后一切正常。

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

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

共有1个答案

公宜春
2023-03-14

更新:

我调试了一下Spring框架。我在Spring-security-core-5.1.1的最新版本中发现了一些非常有趣的事实。更具体地说,在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方法与类的其余部分不一致,因为它不会将用户名转换为小写。因此,如果您在属性文件定义您的用户,它将永远不会工作:配置用户。

在Github中查看Spring源代码后,我发现了这个。

结论:

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

>

  • 如果您使用Spring Boot,请使用最新的父版本,即2.1.1。发布

    如果你坚持使用spring-security-core-5.1.1。释放jar,您应该只使用小写用户名。

  •  类似资料:
    • 然后我添加了一个SecurityConfig。从那时起,CorsFilter停止工作,我在angular应用程序中得到了一个异常: CORS策略阻止了从origin“http://localhost:8080/users/999/folders/%2f/media/”从“http://localhost:4200”访问“http://localhost:8080/users/999/folders

    • 我使用的Gretty示例来自:https://github.com/gretty-gradle-plugin/gretty-sample在主build.gradle我只修改了存储库URL(使用镜像回购由于代理): 建造。格雷德尔: 您可以看到端口被指定为: httpPort=8011 在子项目部分。当我运行Gradle时 格雷德卢:农场跑步 它报告: 因此,jetty仍在尝试使用默认端口8080。

    • 问题内容: 我一点也不了解加密。但是我需要。怎么样? 假设您有一个节点系统,这些节点通过异步消息在网络上相互通信。节点不维护有关其他节点的会话信息(这是设计限制)。 假设您要确保只有您的节点可以读取正在发送的消息。我相信加密是解决方案。 由于节点不维护会话,并且通信必须以无状态,无连接的方式进行,因此我猜想排除了非对称加密。 所以这是我想做的: 消息作为UDP数据报发送 每封邮件都包含一个使邮件有

    • 当我通过spring boot和访问部署我的spring应用程序时,我必须进行身份验证,但是用户名和密码是什么,或者我如何设置它?我试图将其添加到文件中,但没有成功: 这是应用程序的出发点: 这是Tomcat依赖项: 如何在上进行身份验证?

    • 现在我们正在使用Spring Boot5.2构建一个新的应用程序,由于现在应该使用新的Spring Security OAuth,单独的OAuth库已经被废弃,我们还希望用WebClient解决方案替换RestTemplate解决方案,因为RestTemplate在不久的将来也将被废弃。我尝试了几种检索令牌的方法,但找不到有效的解决方案。 我发现了类似Spring Security 5中提到的OA

    • 因此,作为一个初学者,我曾尝试使用spring boot 2.2.11、spring security、thymeleaf和json web令牌创建一个ecommmerce网站,我的问题是,当用户对模板进行身份验证时,即使我在模板中放置了thymeleaf的isAnonyms和IsAuthentificated标记,模板也没有更改。 我有两个问题: 1-/如何告诉所有控制器用户已经登录? 2-/如