Redis集群搭建与JWT安全认证(redis集群jwt)

2023-05-14 01:30:08 集群 搭建 安全认证

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保护

相关文章