spring cloud-给Eureka Server加上安全的用户认证详解

下面是详细的攻略过程,分为三个部分:Eureka Server的基础配置、添加Spring Security的依赖、配置Spring Security的用户认证。

基础配置

首先需要创建一个基础的Eureka Server服务,可以在pom.xml文件中直接添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

接着在application.yml文件中配置基础的Eureka Server服务,例如:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enable-self-preservation: false
    wait-time-in-ms-when-sync-empty: 0
    heart-beat-executor-thread-pool-size: 2
    eviction-interval-timer-in-ms: 10000
    max-idle-thread-in-minutes: 1

以上配置中,服务的监听端口为8761,Eureka Server的实例主机名为localhost,Eureka Client注册时使用服务的主机名和端口号进行注册。

添加Spring Security的依赖

接下来需要在pom.xml文件中添加Spring Security的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

配置Spring Security的用户认证

在完成了Spring Security的添加后,还需要在项目中添加Spring Security的配置类,并在该类中配置用户认证信息:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user")
                .password("{noop}password")
                .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/eureka/**").hasRole("USER")
                .anyRequest().permitAll()
                .and()
                .httpBasic()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}

该配置类使用了基于内存的用户认证,其中具有用户名“user”和密码“password”,并拥有“USER”角色。此外还对/eureka/**路径下的请求进行了授权,只有拥有“USER”角色的用户才能访问该路径。

最后需要在application.yml文件中添加以下配置,将Spring Security的默认启动方式设置为basic authentication:

spring:
  security:
    user:
      name: admin
      password: password
    basic:
      enabled: true

上述配置中设置了管理员用户名和密码,以及启用了basic authentication。

接下来我们来看两个示例:

示例1:使用Postman发送请求生成认证token

首先需要使用管理员账号(上述yaml文件中设置的用户名“admin”和密码“password”)进行认证请求,获取认证令牌:

POST http://localhost:8761/eureka/
Authorization: Basic YWRtaW46cGFzc3dvcmQ=

响应:
HTTP 200 OK

在响应中会返回类似以下格式的认证令牌(其中的字符串就是认证token):

data: {
  "token_type": "bearer",
  "access_token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6Ind3dy5leGFtcGxlLmNvbSIsImp0aSI6ImM5YjdjM2M5LTM5MzItNDAxNy1hOGZhLThlZjY1ZWI0MDIxMiIsImlhdCI6MTYxMTg4NjIyMCwiZXhwIjoxNjExODg5NDIwLCJzY29wZSI6WyJvcGVuaWQiXX0.5SrcjRfVa1weQVsl1sSdSS52BRK5uGHQpomfWP5yy5g",
  "expires_in": 43199,
  "scope": "openid",
  "jti": "c9b7c3c9-3932-4017-a8fa-8ef65eb40212"
}

之后,使用上述token进行Eureka Server其他操作的请求,例如获取所有服务的信息:

GET http://localhost:8761/eureka/apps
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6Ind3dy5leGFtcGxlLmNvbSIsImp0aSI6ImM5YjdjM2M5LTM5MzItNDAxNy1hOGZhLThlZjY1ZWI0MDIxMiIsImlhdCI6MTYxMTg4NjIyMCwiZXhwIjoxNjExODg5NDIwLCJzY29wZSI6WyJvcGVuaWQiXX0.5SrcjRfVa1weQVsl1sSdSS52BRK5uGHQpomfWP5yy5g

响应:
HTTP 200 OK

以上示例中,我们使用了basic authentication进行用户认证,并使用认证令牌进行其他操作的请求。

示例2:使用Java编写的Eureka Client进行注册

让我们来看另一个示例,这里介绍如何使用Spring Cloud编写的Eureka Client,在其中添加安全认证和注册服务的功能。

首先是在Eureka Client的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
    <version>2.1.7.RELEASE</version>
</dependency>

接下来在application.yml文件中配置Eureka Client:

server:
  port: 8080

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    registerWithEureka: true
    fetchRegistry: true
  instance:
    hostname: localhost
    instanceId: ${spring.application.name}:${spring.application.instance_id:${server.port}}
  # 安全认证配置
  security:
    oauth2:
      client:
        client-id: client
        client-secret: secret
        access-token-uri: http://localhost:8761/oauth/token
        user-authorization-uri: http://localhost:8761/oauth/authorize
  user:
    name: user
    password: password

以上配置中,Eureka Client监听的端口是8080,注册到的Eureka Server的地址为localhost:8761。其中安全认证的部分使用了OAuth2的配置,客户端ID为client,客户端密码为secret,以及访问token和用户授权的URI。此外还设置了一个基础用户,用户名为user,密码为password。

接下来是Eureka Client的Java代码实现:

@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }

    @RestController
    public class TestController {
        @GetMapping("/test")
        public String test() {
            return "test";
        }
    }
}

以上代码中,我们向Eureka Client添加了一个GET类型的API接口“/test”,用于测试。

最后在WebSecurityConfig中添加一个用于Eureka Client注册的账户(这里使用的是基础认证,因此只需要一个账户):

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user")
                .password("{noop}password")
                .roles("USER")
                .and()
                .withUser("client")
                .password("{noop}secret")
                .roles("CLIENT");
    }
    ...
}

以上配置中,我们添加了一个名为“client”的账户,密码为“secret”,且拥有“CLIENT”角色。

最后,我们可以启动Eureka Server、Eureka Client,并使用客户端向Eureka Server进行注册,例如在Eureka Client使用curl工具发送以下请求:

curl -X POST 'http://user:password@localhost:8080/eureka/apps/client' \
     -H 'Content-Type: application/json' \
     -d '{"instance": {"instanceId": "client:8080", "app": "client", "hostName": "localhost", "ipAddr": "127.0.0.1", "port": {"$": 8080, "@enabled": "true"}, "securePort": {"$": 8443, "@enabled": "false"}, "homePageUrl": "http://localhost:8080/", "statusPageUrl": "http://localhost:8080/actuator/info", "healthCheckUrl": "http://localhost:8080/actuator/health", "vipAddress": "client", "metadata": {"management.port": "8080", "management.endpoints.web.base-path": "/actuator", "jmx.port": "7986", "jmx.remote.ssl": "false"}}}'

以上示例主要介绍了如何使用Java编写的Eureka Client向Eureka Server进行注册并添加安全认证。由于使用了OAuth2的安全认证,因此在完成注册前需要使用正确的客户端ID、客户端密码和访问令牌等进行安全认证。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring cloud-给Eureka Server加上安全的用户认证详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Java实习打卡8道面试题

    下面是Java实习打卡8道面试题的完整攻略。 1. 如何取数组中的随机数? 可以使用Java内置的Math.random()方法来取得一个0到1之间的随机数,然后根据数组长度与所需随机数的范围进行计算即可。 int[] nums = {1, 2, 3, 4, 5}; int range = 3; // 从数组中取3个随机数 int[] randomNums …

    Java 2023年5月26日
    00
  • ajax对注册名进行验证检测是否存在于数据库中

    检测注册名是否已存在于数据库中是Web开发中常见的需求之一,而Ajax技术则常被用来实现前端异步验证。下面,我将为您讲解实现这一需求的完整攻略。 1. 前端实现 前端实现的主要流程如下: 给用户名输入框绑定事件 监听输入框的值变化,触发Ajax请求 将输入框的值作为参数发送给后端API 根据API的返回结果,展示相应的提示信息 示例代码如下: <inp…

    Java 2023年6月15日
    00
  • 一篇文章教带你了解Java Spring之自动装配

    一篇文章教带你了解Java Spring之自动装配 1. 理解什么是自动装配 在Spring中,依赖注入(DI)是实现对象之间解耦的一种常用方式。而自动装配(Autowiring)则是一种更加便利的依赖注入方式,它能够自动地为容器中需要注入的对象找到合适的实例。自动装配可以减少开发者对注入实例的手动处理,减少了代码冗余。 2. Spring的自动装配模式 S…

    Java 2023年5月19日
    00
  • Keycloak各种配置及API的使用说明

    Keycloak各种配置及API的使用说明 前言 Keycloak是一个完整的开源身份和访问管理解决方案,它提供了一组统一的API,可用于管理身份验证、授权和保护应用和服务。 本文将详细介绍如何配置Keycloak以及如何使用其API进行身份验证、授权等操作。 配置Keycloak 创建一个Keycloak Realm 登录Keycloak控制台,选择左侧的…

    Java 2023年5月20日
    00
  • 浅谈用java实现事件驱动机制

    浅谈用Java实现事件驱动机制的完整攻略如下: 1. 什么是事件驱动机制 事件驱动是一种编程模型,指的是程序在运行过程中,按照事件或者消息的顺序来触发相应的处理代码,从而完成程序的任务。事件驱动机制通常包括三个主要组成部分:事件源、事件对象以及事件监听器。 2. 事件源、事件对象和事件监听器 事件源是触发事件的源头,是指能够发生某种动作或引起某种状态变化的对…

    Java 2023年5月19日
    00
  • Java中I/O输入输出的深入讲解

    Java中I/O输入输出的深入讲解 什么是I/O I/O(Input/Output)指的是数据的输入和输出,是计算机与程序外部世界进行信息交互的方式之一。在Java中,I/O被视为一种Java API,提供了许多与文件、网络和其他I/O设备进行数据输入和输出的类和方法。 I/O的主要类型 字节流 字节流(Byte Stream)以字节为单位进行操作,可以读写…

    Java 2023年5月26日
    00
  • Spring MVC Controller返回值及异常的统一处理方法

    下面我将为你详细讲解“Spring MVC Controller返回值及异常的统一处理方法”的完整攻略。 一、Controller返回值的处理 在Spring MVC框架中,Controller负责处理客户端的HTTP请求并响应相应的结果给客户端。当客户端请求到达Controller之后,Controller需要根据业务逻辑处理数据,并根据结果返回响应结果给…

    Java 2023年5月27日
    00
  • Java如何实现对称加密

    Java中通过对称加密算法实现加密和解密是常见的安全操作。该过程可以通过以下步骤来实现: 1. 选定对称加密算法 对称加密算法的特点是加密解密使用同一密钥。Java中常见的对称加密算法有DES、3DES、AES等。在选择加密算法时,需根据应用场景、性能、安全性需求等多个方面进行综合考虑。 下面以AES算法为例进行讲解。 2. 生成密钥 使用Java中的Key…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部