Redis集群搭建与JWT安全认证(redis集群jwt)
Redis集群搭建与JWT安全认证
Redis是一款开源的高性能的key-value数据库,以其高速、可持久化、分布式、多种数据结构及其强大的缓存功能而备受青睐。在实际的生产环境中,Redis集群的搭建和JWT安全认证也显得非常重要。
一、Redis集群搭建
1. 配置虚拟机
Redis集群可以搭建在不同的虚拟机上,这里我们以CentOS7为例。首先需要配置虚拟机,安装并配置好CentOS7系统,配置好网络和Nginx。
2. 安装和配置Redis
从Redis官方网站http://redis.io/下载最新版本的Redis,解压至指定的目录下,按照以下步骤进行配置:
a)创建当前服务器的Redis配置文件,比如我们创建一个名为redis1.conf的文件,在该文件中添加如下内容:
port 6379 //端口号
daemonize yes //在启动时,Redis将会以守护进程(daemon)方式运行
pidfile /var/run/redis_6379.pid //日志的位置
logfile /data/redis/log/redis_6379.log //日志文件名称
dbfilename dump_6379.rdb
dir /data/redis/db
appendonly yes //默认情况下Redis采用快照来进行持久化,当然也支持appendonly方式
appendfsync everysec //每秒钟同步一次磁盘
b)在redis目录下创建redis.sh文件,添加如下内容:
# chkconfig: – 85 15
# description: redis daemon
ULIMIT=”-n 100000″
# redis server config file
REDIS_CONF_FILE=”/etc/redis/redis1.conf”
# redis server executable path
REDIS_SERVER_EXEC=”/usr/local/redis/bin/redis-server”
stop()
{
/bin/kill `cat /var/run/redis_6379.pid`
}
start()
{
if [ -f $REDIS_CONF_FILE ]; then
ulimit -n 100000
$REDIS_SERVER_EXEC $REDIS_CONF_FILE
fi
}
restart()
{
stop
sleep 2
start
}
case “$1” in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $”Usage: $0 {start|stop|restart}”
exit 1
esac
exit $?
c)修改后的redis.sh文件需增加执行权限。
chmod a+x redis.sh
d)启动Redis服务
./redis.sh start
3. Redis集群架构
Redis集群的节点分为主节点和从节点,每个节点都要配置好Redis,主节点需要在启动时进行配置,包括节点的ip地址和端口号等,同时对从节点进行复制,从节点在启动时需要配置连接主节点的ip地址和端口号等信息。
4. Redis集群的启动
进入Redis的目录后,执行以下命令:
./redis-cli –cluster create 192.168.33.10:6379 192.168.33.10:6380 192.168.33.10:6381 192.168.33.10:6382 192.168.33.10:6383 192.168.33.10:6384 –cluster-replicas 1
该命令意为:创建一个ip为192.168.33.10的Redis集群,其中端口号分别为6379、6380、6381、6382、6383、6384,该集群的从节点数量为1,根据实际情况进行修改。
5. Redis集群管理
Redis集群不仅支持节点的添加和删除操作,还支持节点数据的迁移,节点宕机的自动转移等,相比单机模式下更加健壮和可靠。对于Redis集群管理而言,可以采用官方提供的Redis-cli工具进行管理。
6. SpringBoot集成Redis
在SpringBoot开发中,我们可以通过Jedis或Lettuce来访问Redis,同时结合SpringBoot提供的缓存注解@Cacheable来实现Redis的读取和写入缓存,从而进一步提升系统的性能与稳定性。
二、JWT安全认证
JWT(Json Web Token)是一种基于JSON的开放标准(RFC 7519),用于在网络环境中传递声明。JWT可以使用HMAC算法或者RSA公钥/私钥对JWT进行签名,从而保证JWT的安全性。
1. JWT的组成结构
JWT由三部分组成,分别是头部、有效载荷和签名,其中头部和有效载荷分别采用Base64URL编码,中间部分用“.”分隔。
2. JWT的使用流程
JWT的使用流程如下:
a)客户端请求需要进行安全认证的服务端接口,传递认证信息。
b)服务端对客户端传递的认证信息进行校验。
c)服务端返回对应的响应信息。
3. SpringSecurity结合JWT实现
在SpringBoot中,我们可以通过SpringSecurity和JWT结合来实现安全认证。在实现过程中,需要进行如下配置:
a)添加依赖
io.jsonwebtoken
jjwt-api
0.11.2
io.jsonwebtoken
jjwt-impl
0.11.2
io.jsonwebtoken
jjwt-jackson
0.11.2
b)实现UserDetls接口
我们需要实现UserDetls接口,并重写相关方法,同时通过@Component注解将其注册成Spring容器中的一个Bean。
@Component
public class JwtUserDetlsServiceImpl implements UserDetlsService {
@Autowired
private SysUserService sysUserService;
@Override
public UserDetls loadUserByUsername(String username) throws UsernameNotFoundException {
SysUser user = sysUserService.getByUsername(username);
if (user == null) {
throw new UsernameNotFoundException(String.format(“用户不存在’%s’.”, username));
} else {
List grantedAuthorities = new ArrayList();
return new JwtUser(user.getUsername(), user.getPassword(), grantedAuthorities);
}
}
}
c)实现AuthenticationProvider接口
我们需要实现AuthenticationProvider接口,并重写相关方法,通过@Component注解将其注册成Spring容器中的一个Bean。
@Component
public class JwtAuthenticationProvider implements AuthenticationProvider {
@Autowired
private UserDetlsService jwtUserDetlsService;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
JwtAuthenticationToken jwtAuthenticationToken = (JwtAuthenticationToken) authentication;
String token = jwtAuthenticationToken.getToken();
Clms clms = jwtTokenUtil.getClmsFromToken(token);
String username = clms.getSubject();
JwtUser userDetls = (JwtUser) jwtUserDetlsService.loadUserByUsername(username);
if (!jwtTokenUtil.validateToken(token, userDetls)) {
throw new JwtException(“无效的Token”);
}
Collection authorities = userDetls.getAuthorities();
return new UsernamePasswordAuthenticationToken(userDetls, token, authorities);
}
@Override
public boolean supports(Class authentication) {
return JwtAuthenticationToken.class.isAssignableFrom(authentication);
}
}
d)配置SpringSecurity
在SpringSecurity的配置类中进行相关配置。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationProvider jwtAuthenticationProvider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(jwtAuthenticationProvider);
}
@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter();
jwtAuthenticationFilter.setAuthenticationManager(authenticationManagerBean());
jwtAuthenticationFilter.setAuthenticationSuccessHandler(new JwtAuthenticationSuccessHandler());
jwtAuthenticationFilter.setAuthenticationFlureHandler(new JwtAuthenticationFlureHandler());
return jwtAuthenticationFilter;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// 关闭csrf保护