下面是详细的攻略过程,分为三个部分: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技术站