Почему spring.security.user.name и пароль не работают с сервером конфигурации Spring Cloud, используемым через Spring Boot 2? - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь защитить свой сервер конфигурации Spring Cloud.В качестве первого шага я последовал руководству, которое довольно просто сделать.Конфиг-сервер работает нормально без авторизации.Но проблема начинается, когда я хочу использовать очень простую базовую аутентификацию.Я определяю свой собственный пользователя и пароль в свойствах spring.security.user.name и spring.security.user.password , но служба, похоже, не работает с ними.

Когда я просто оставляю эти свойства и использую «пользователя» по умолчанию и сгенерированный пароль, тогда все в порядке.Я застрял с этим некоторое время и пытаюсь решить.

Вот важная часть моего файла конфигурации pom.xml file:

<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 в качестве имени пользователя и сгенерированный пароль в bootstrap.yml сервера обнаружения, тогда все работает нормально.

Кто-нибудьЕсть идеи, почему пользовательские имя пользователя и пароль не работают?

Любая помощь будет принята с благодарностью.Возможно, я совершил очень тривиальную ошибку и просто не понял ее.

1 Ответ

0 голосов
/ 11 декабря 2018

ОБНОВЛЕНИЕ:

Я немного отладил среду 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 .

После того, как я проверил исходный код Spring в Github, я обнаружил this .

Заключение :

Проблема была в имени пользователя, а не в пароле.Если вы хотите получить эту работу, у вас есть следующие опции:

  1. Если вы используете Spring Boot, используйте последнюю родительскую версию, которая является 2.1.1.RELEASE

  2. Если вы настаиваете на использовании spring-security-core-5.1.1.RELEASE.jar , вам следует использовать только имена пользователей в нижнем регистре.

...