Eureka Server 加上安全认证之后,服务无法注册

本文介绍了解决在Spring Security中遇到的CSRF保护导致的问题。通过创建自定义的WebSecurityConfig类,可以轻松地禁用CSRF保护,实现基本认证。这对于需要简化安全设置的开发者来说是一个实用的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:

https://blog.youkuaiyun.com/weixin_39913200/article/details/80845867

è¿éåå¾çæè¿°

在地址里加上用户名密码,然后运行还是报错,是因为新版本的security默认开启csrf了,关掉就好了,新建一个配置类,看下面:

package com.yezi.dreamspark.dreamsparkserver.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
   http.csrf().disable(); //关闭csrf
    http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); //开启认证
    }

}

 

<think>嗯,用户再次确认了关于Eureka集成OAuth2认证的需求,并提供了具体的引用资料。这次的问题更聚焦在"Eureka注册接口本身是否支持OAuth2认证"这个技术细节上,看来用户正在实施微服务安全方案。从对话历史看,用户应该是位后端开发工程师,正在搭建安全的SpringCloud微服务架构。ta可能遇到了注册中心未授权访问的安全隐患,需要给Eureka注册接口加上OAuth2防护。用户提供的引用材料里提到SpringCloudConfig和Consul,但核心关注点还是Eureka。注意到引用[3]提到了服务注册的实现步骤,这个思路可以借鉴:本质上是要在服务实例注册时和EurekaServer通信阶段插入OAuth2认证层。SpringCloud的安全机制确实支持这种扩展。具体到技术实现,需要分三个层面考虑:1)服务端:通过SpringSecurity在EurekaServer端保护/eureka/**端点2)客户端:修改EurekaClient配置使其注册时携带BearerToken3)认证协调:需要统一客户端和服务端的安全配置,特别是client-id和scope的匹配用户展示的代码片段里有几个关键点要特别注意:-EurekaServer的security.oauth2.resource.filter-order必须高于默认值(eureka默认是3)-客户端配置中的grant_type必须用client_credentials-服务端和客户端要共用同一个token存储(比如Redis)考虑到用户的环境,建议优先测试client_credentials模式,这种模式最适合服务间认证。如果用户后期需要用户级认证,可以再扩展为password模式。潜在的风险点在于:如果EurekaServer启用了安全认证,但没有正确配置白名单,可能会阻塞健康检查请求。需要确保/actuator/health端点开放访问。关于用户提供的引用材料:引用[1]的@EnableDiscoveryClient是基础,但未涉及安全配置;引用[2]的日志依赖关系大,过集成OAuth2时确实需要关注日志排查问题;引用[3]的Consul实现思路可以参考,但具体配置差异较大。用户最后明确要求生成相关问题,应该是对微服务安全体系有整体规划。除了解答核心问题,延伸问题可以覆盖令牌管理、授权模式选择等实用场景。</think> Spring Eureka本身直接支持OAuth2认证,但可通过**Spring Security OAuth2集成实现注册接口的认证保护**。以下是具体实现步骤和原理: --- ### 一、Eureka Server端配置 OAuth2 认证 #### 1. 添加关键依赖 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version>2.6.8</version> </dependency> ``` #### 2. 安全配置类 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/actuator/**").permitAll() // 开放健康检查端点 .anyRequest().authenticated() // 其他请求需认证 .and() .oauth2ResourceServer() .jwt(); // 使用JWT令牌验证 } } ``` #### 3. 注册中心接口保护配置 在`application.yml`中显式保护Eureka端点: ```yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: http://auth-server:9000 # OAuth2认证服务器地址 eureka: server: enable-self-preservation: false # 测试环境可关闭自我保护 ``` #### 4. 资源服务器配置 ```java @Configuration public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/eureka/**").hasAuthority("SCOPE_eureka:write") // 需要特定权限 .anyRequest().authenticated(); } } ``` --- ### 二、Eureka Client端配置 #### 1. 客户端添加认证支持 ```yml eureka: client: service-url: defaultZone: http://client_id:client_secret@eureka-server:8761/eureka/ ``` #### 2. 微服务注册时携带Token 通过`DiscoveryClientOptionalArgs`注入认证头: ```java @Bean public DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs() { DiscoveryClientOptionalArgs args = new DiscoveryClientOptionalArgs(); args.setAdditionalFilters(Collections.singletonList(new OAuth2Filter())); return args; } // 自定义过滤器 public class OAuth2Filter implements ClientFilter { @Override public ClientResponse handle(ClientRequest request) { request.getHeaders().add("Authorization", "Bearer " + getToken()); return getNext().handle(request); } } ``` --- ### 三、工作原理图解 ```mermaid sequenceDiagram participant Client as 微服务客户端 participant AuthServer as OAuth2认证服务器 participant Eureka as Eureka Server Client->>AuthServer: 请求访问令牌(client_credentials模式) AuthServer-->>Client: 返回JWT令牌 Client->>Eureka: 注册请求(携带Bearer Token) Eureka->>AuthServer: 验证Token有效性 AuthServer-->>Eureka: 验证结果 alt 验证成功 Eureka-->>Client: 返回204注册成功 else 验证失败 Eureka-->>Client: 返回401拒绝访问 end ``` --- ### 四、验证要点 1. **令牌权限验证** 确保JWT包含`eureka:write`权限声明(Claim) ```json { "scope": ["eureka:write", "other:read"] } ``` 2. **健康检查豁免** 必须开放`/actuator/health`端点,否则会导致服务频繁下线: ```yaml management: endpoints: web: exposure: include: health,info ``` 3. **安全配置优先级** 使用`@Order(ManagementServerProperties.BASIC_AUTH_ORDER + 1)`确保安全配置覆盖默认配置 --- ### 典型报错解决方案 | 问题现象 | 原因 | 解决方案 | |---------|------|---------| | `Registration failed: 401 Unauthorized` | Token缺失或过期 | 检查客户端令牌生成逻辑 | | `EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING...` | 健康检查被拦截 | 确保`/actuator/**`免认证 | | `Token validation failed` | 公钥配置错误 | 核对`spring.security.oauth2.resourceserver.jwt.issuer-uri` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值