我正在努力保护我的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,然后一切正常。
有人知道为什么自定义用户名和密码不起作用吗?
任何帮助都将不胜感激。我可能犯了一个非常微不足道的错误,只是没有真正认识到它。
更新:
我调试了一下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-/如