Spring Cloud微服务基于Redis集群的单点登录实现解析
本攻略将详细讲解Spring Cloud微服务基于Redis集群的单点登录实现的过程,包括搭建过程、示例说明。
搭建过程
1. 创建Spring Boot项目
-
创建一个Spring Boot项目,命名为sso-server。
-
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
其中,spring-boot-starter-web
表示Spring Boot的Web组件,spring-session-data-redis
表示Spring Session的Redis存储,spring-boot-starter-security
表示Spring Security组件,spring-security-test
表示Spring Security的测试组件,spring-cloud-starter-netflix-eureka-client
表示Eureka Client组件。
- 在application.properties文件中添加以下配置:
server.port=8080
spring.application.name=sso-server
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
spring.session.store-type=redis
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
其中,server.port
表示端口号,spring.application.name
表示应用程序名称,eureka.client.service-url.defaultZone
表示Eureka Server的地址,spring.session.store-type
表示Session存储类型,spring.redis.host
表示Redis的主机名,spring.redis.port
表示Redis的端口号,spring.redis.password
表示Redis的密码。
2. 创建登录页面
- 在resources/static目录下创建login.html文件,添加以下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/login" method="post">
<div>
<label for="username">用户名:</label>
<input type="text" id="username" name="username">
</div>
<div>
<label for="password">密码:</label>
<input type="password" id="password" name="password">
</div>
<div>
<button type="submit">登录</button>
</div>
</form>
</body>
</html>
其中,action
属性表示表单提交的地址,method
属性表示表单提交的方法。
3. 创建安全配置
- 创建一个Security配置类,命名为SecurityConfig,添加以下代码:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
}
其中,@Configuration
注解表示这是一个配置类,@EnableWebSecurity
注解表示启用Web安全,WebSecurityConfigurerAdapter
是Spring Security提供的一个适配器类,可以方便地配置Web安全。
- 创建一个UserDetailsService实现类,命名为UserDetailsServiceImpl,添加以下代码:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if ("admin".equals(username)) {
return new User("admin", passwordEncoder().encode("admin"), Collections.emptyList());
} else {
throw new UsernameNotFoundException("用户不存在");
}
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
其中,@Service
注解表示这是一个服务类,UserDetailsService
是Spring Security提供的一个接口,用于加载用户信息,User
是Spring Security提供的一个用户实体类,PasswordEncoder
是Spring Security提供的一个密码编码器,用于加密密码。
4. 创建Redis配置
- 创建一个Redis配置类,命名为RedisConfig,添加以下代码:
@Configuration
@EnableRedisHttpSession
public class RedisConfig {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
}
其中,@Configuration
注解表示这是一个配置类,@EnableRedisHttpSession
注解表示启用Redis存储Session,LettuceConnectionFactory
是Spring Session提供的一个Redis连接工厂。
5. 创建Eureka Client
-
创建一个Spring Boot项目,命名为sso-client。
-
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 在application.properties文件中添加以下配置:
server.port=8081
spring.application.name=sso-client
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
其中,server.port
表示端口号,spring.application.name
表示应用程序名称,eureka.client.service-url.defaultZone
表示Eureka Server的地址。
- 创建一个RestController,添加以下代码:
@RestController
public class HomeController {
@GetMapping("/home")
public String home() {
return "Welcome to SSO Client!";
}
}
其中,@GetMapping
注解表示处理HTTP GET请求。
- 在启动类上添加@EnableDiscoveryClient注解,启用Eureka Client。
6. 验证单点登录
-
启动Eureka Server、sso-server、sso-client。
-
访问sso-client的控制台,可以看到sso-client已经注册到Eureka Server上。
-
访问sso-server的控制台,输入用户名和密码,可以看到登录成功,并跳转到sso-client的/home页面。
-
访问sso-client的/home页面,可以看到已经成功登录。
示例说明
以下是两个示例说明,分别演示了如何使用Spring Cloud微服务基于Redis集群的单点登录实现。
示例一:使用Feign调用微服务
-
创建一个Spring Boot项目,命名为sso-consumer。
-
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在application.properties文件中添加以下配置:
server.port=8082
spring.application.name=sso-consumer
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
其中,server.port
表示端口号,spring.application.name
表示应用程序名称,eureka.client.service-url.defaultZone
表示Eureka Server的地址。
- 创建一个Feign接口,命名为SsoClient,添加以下代码:
@FeignClient(name = "sso-client")
public interface SsoClient {
@GetMapping("/home")
String home();
}
其中,@FeignClient
注解表示这是一个Feign客户端,name
属性表示要调用的微服务名称。
- 创建一个RestController,添加以下代码:
@RestController
public class SsoController {
@Autowired
private SsoClient ssoClient;
@GetMapping("/home")
public String home() {
return ssoClient.home();
}
}
其中,@Autowired
注解表示自动注入SsoClient,@GetMapping
注解表示处理HTTP GET请求。
-
在启动类上添加@EnableFeignClients注解,启用Feign客户端。
-
启动Eureka Server、sso-server、sso-client、sso-consumer。
-
访问sso-consumer的/home接口可以看到sso-consumer成功调用了sso-client的/home接口,并返回了"Welcome to SSO Client!"。
示例二:使用Ribbon实现负载均衡
-
创建一个Spring Boot项目,命名为sso-consumer-ribbon。
-
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- 在application.properties文件中添加以下配置:
server.port=8083
spring.application.name=sso-consumer-ribbon
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
其中,server.port
表示端口号,spring.application.name
表示应用程序名称,eureka.client.service-url.defaultZone
表示Eureka Server的地址。
- 创建一个RestController,添加以下代码:
@RestController
public class SsoController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/home")
public String home() {
String url = "http://sso-client/home";
return restTemplate.getForObject(url, String.class);
}
}
其中,RestTemplate
是Spring提供的一个HTTP客户端,可以用来调用其他微服务。
-
在启动类上添加@LoadBalanced注解,启用Ribbon负载均衡。
-
创建多个sso-client,分别命名为sso-client1、sso-client2、sso-client3等。
-
在application.properties文件中添加以下配置:
server.port=8084
spring.application.name=sso-client1
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
其中,server.port
表示端口号,spring.application.name
表示应用程序名称,eureka.client.service-url.defaultZone
表示Eureka Server的地址。
- 创建一个RestController,添加以下代码:
@RestController
public class HomeController {
@GetMapping("/home")
public String home() {
return "Welcome to SSO Client 1!";
}
}
-
在启动类上添加@EnableDiscoveryClient注解,启用Eureka Client。
-
启动Eureka Server、sso-server、sso-client、sso-client1、sso-client2、sso-client3、sso-consumer-ribbon。
-
访问sso-consumer-ribbon的/home接口,可以看到sso-consumer-ribbon成功调用了sso-client1、sso-client2、sso-client3等多个sso-client,并返回了"Welcome to SSO Client 1!"。
总结
使用Spring Cloud微服务基于Redis集群的单点登录实现是一种简单、高效的方式。在实际应用中,我们可以据具体情况选择合适的微服务架构,满足业务需求和技术发展。使用Feign调用微服务可以提高开发效率和代码可读性,使用Ribbon实现负载均衡可以提高系统的可靠性和可扩性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springcloud微服务基于redis集群的单点登录实现解析 - Python技术站