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微信小程序oss图片上传的实现方法

    我很乐意为你介绍“Java微信小程序oss图片上传的实现方法”的完整攻略。 简介 微信小程序是基于微信平台提供的一种新型应用,其天生具备了社交和强大的传播能力。作为一种重要的互联应用,微信小程序在业界受到广泛关注和应用。本文主要讲解在微信小程序中使用OSS存储来实现图片上传的相关知识和具体操作。 前置知识 在开始讲解具体实现方法之前,有几个重要的前置知识需要…

    Java 2023年5月23日
    00
  • Java使用Freemarker页面静态化生成的实现

    下面我将详细讲解“Java使用Freemarker页面静态化生成的实现”的完整攻略。 什么是Freemarker Freemarker是一款模板引擎,它通过模板和数据生成指定格式的文本输出。在Java Web开发中,可用于生成HTML、XML、JSON等各种格式的文本。在网站开发中,我们可以使用Freemarker来实现页面静态化。 实现步骤 引入依赖 在M…

    Java 2023年6月15日
    00
  • SpringBoot配置和切换Tomcat流程详解

    关于SpringBoot配置和切换Tomcat的流程,我来为您详细讲解。 1. SpringBoot 配置 Tomcat 的默认端口 SpringBoot默认使用的Tomcat端口是8080,可以通过在配置文件中配置server.port来修改端口号,例如设置为8090端口,只需要按照以下步骤操作: 打开配置文件application.properties或…

    Java 2023年6月2日
    00
  • 不到30行JS代码实现Excel表格的方法

    如何用少于30行的JS代码实现Excel表格呢?接下来让我们详细讲解一下。 概述 首先,我们需要明确两件事情:一是我们要创建一个表格,二是我们要将表格数据导出为Excel文件。实现这两个功能,需要用到一些JS库和API。 准备工作 在编写JS代码之前,我们需要先安装以下两个JS库: SheetJS:该库可以使我们将表格数据转换为Excel文件。 FileSa…

    Java 2023年6月15日
    00
  • WEB常见漏洞问题危害及修复建议

    WEB常见漏洞问题危害及修复建议 1. 漏洞问题概述 WEB常见漏洞是指在Web应用程序的设计、开发、运维、维护等各个环节中可能存在的安全隐患。常见的Web安全漏洞有SQL注入、跨站脚本攻击、文件包含漏洞、不安全文件上传、恶意重定向、Session劫持、CSRF攻击等。 这些漏洞问题会造成以下危害: 数据丢失或数据泄露:攻击者可能会利用这些漏洞访问、修改、删…

    Java 2023年6月15日
    00
  • Java基础之创建虚拟机对象的过程详细总结

    首先我们需要了解Java创建虚拟机对象的过程。当使用new关键字创建一个对象的时候,Java虚拟机需要经过以下几个步骤: 1.检查是否已经加载该类,如果没有,则加载它。 2.检查该类是否继承自其它类或实现了接口,如果有,则需要先加载这些父类和接口。 3.为对象分配内存空间。 4.对内存空间进行必要的初始化。 5.调用对象的构造方法对对象进行初始化。 下面是两…

    Java 2023年5月26日
    00
  • Spring boot 使用JdbcTemplate访问数据库

    下面是Spring Boot使用JdbcTemplate访问数据库的完整攻略。 一、添加JDBC和数据库驱动 首先,需要在Spring Boot项目中添加JDBC依赖以及相关的数据库驱动。在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</grou…

    Java 2023年5月20日
    00
  • Mybatis新手教程之简单入门

    Mybatis是一个支持基于XML或注解的SQL语句编写和执行的轻量级开源框架,本文将会详细介绍Mybatis的入门使用,让新手能够轻松掌握该框架的使用方法。 步骤一:导入Mybatis依赖 在使用Mybatis前,需要在项目中引入相关的依赖。可以通过Maven等构建工具来导入以下两个MyBatis相关的jar包: <dependency> &l…

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