
在原先dubbo+zookeeper项目中,web模块只暴露Restful接口,各服务模块只暴露duboo接口,此时用户登录后由web项目进行token的鉴权和验证,并通过dubbo的隐式传参将sessionID传递给dubbo服务模块, 拦截器再根据sessionID从Redis中获取用户信息设置到当前线程
然鹅,在springcloud中,各个微服务直接暴露的是restful接口,此时如何让各个微服务获取到当前用户信息呢?最佳的方式就是token了,token作为BS之间的会话标识(一般是原生随机token),同时也可以作为信息的载体传递一些自定义信息(jwt, 即Json web token)。
为了能更清楚的了解本文,需要对spring-security-oauth 及 jwt有一定了解,本文只关注用户信息传递这一块
认证服务器配置 AuthorizationServerConfigurerAdapter
自定义token转换器
CustomJwtAccessTokenConverter
此时按照固定格式访问授权服务器token接口获取token,如图,可以获取到jwt格式的token,并且额外信息nick_name也已经添加
直接解析jwt字符串可以获取到以下信息,即用户名和授权信息
只需要指定和授权服务器一模一样的token store 和token converter
在securiy的过滤器中 OAuth2AuthenticationProcessingFilter 会从token中获取相关信息进行鉴权
源码:
注意,资源服务器主要配置在
ResourceServerConfigurerAdapter
微服务获取jwttoken中的用户信息,两种方式,使用security上下文可以直接获取当前用户名和权限,另一种自定义拦截器获取额外信息。
这个就简单了,获取header头解析验证token
然后获取之前从授权服务器中的添加的 nick_name的额外信息放入线程变量
其中用户上下文类
启动拦截器注册webmvc配置类
在controller中获取用户信息如图
在默认的认证异常如图
假设我们做了全局异常处理,前端希望在token过期时做统一的登录跳转如何做?
实现 AuthenticationEntryPoint 接口重写 commence 方法即可
注意,直接抛出异常并不会走 @RestControllerAdvice , 因为在这里是response直接返回,并没有使用到Controller处理
此时返回我自定义的Response对象,如图
您好,要获得JavaSpringBoot的根目录sudo读写权限,首先需要确保您的用户有sudo权限,如果没有,可以使用sudo命令进行授权。接下来,您可以使用chmod命令来更改文件或目录的权限,例如:chmod 777 /path/to/file/or/directory,这样就可以让您的用户拥有读写权限。此外,您还可以使用chown命令来更改文件或目录的所有者,例如:chown username /path/to/file/or/directory,这样就可以让您的用户拥有读写权限。最后,您还可以使用chgrp命令来更改文件或目录的组,例如:chgrp groupname /path/to/file/or/directory,这样就可以让您的用户拥有读写权限。总之,要获得JavaSpringBoot的根目录sudo读写权限,您需要确保您的用户有sudo权限,并且使用chmod、chown和chgrp命令来更改文件或目录的权限、所有者和组。
下载、编译并安装Redis
接下来对Redis进行build。
下载并提取源代码
由于我们不需要长期保留源代码,因此可以直接在/tmp目录内进行build:
- cd /tmp
12
现在下载Redis最新版本,大家可以使用稳定下载URL:
- curl -O h//downloadredisio/redis-stabletargz
12
解压tar:
- tar xzvf redis-stabletargz
12
前往Redis源目录:
- cd redis-stable
12
Build并安装Redis
现在对Redis二进制代码进行编译:
- make
12
编译完成后,运行测试套件以确保built正确:
- make test
12
这一过程通常需要几分钟。完成后,大家可以使用以下命令进行安装:
- sudo make install
12
配置Redis
Redis已经安装完成,接下来进行配置。首先创建一个配置目录,这里我们使用/etc/redis目录:
- sudo mkdir /etc/redis
12
将Redis源归档文件内的示例Redis配置文件复制进来:
- sudo cp /tmp/redis-stable/redisconf /etc/redis
12
而后打开文件并进行调整:
- sudo nano /etc/redis/redisconf
12
在文件中找到supervised命令。现在其被设置为no。由于我们运行的 *** 作系统使用systemd init系统,因此需要将其变更为systemd:
/etc/redis/redisconf
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready"
# They do not enable continuous liveness pings back to your supervisor
supervised systemd
1234567891011121314151617
下面找到dir目录。此选项指定Redis用于放置持久数据的目录。我们需要挑选合适的位置,并确保Redis有权限写入但普通用户无权查看。
这里我们使用/var/lib/redis目录,稍后进行创建:
/etc/redis/redisconf
# The working directory
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive
#
# The Append Only File will also be created inside this directory
#
# Note that you must specify a directory here, not a file name
dir /var/lib/redis
12345678910111213141516
完成后保存并退出。
创建Redis systemd Unit文件
接下来,我们可以创建一个systemd unit文件,从而利用该init系统管理Redis进程。
首先创建并打开/etc/systemd/system/redisservice文件:
- sudo nano /etc/systemd/system/redisservice
12
在这里,我们在[Unit]部分处添加一条描述,定义要求网络在服务启动前必须处于可用状态:
/etc/systemd/system/redisservice
[Unit]
Description=Redis In-Memory Data Store
After=networktarget
123456
在[Service]部分,我们需要指定该服务的运作方式。出于安全考虑,我们不应以root方式运行服务。我们应当使用专用用户及群组,并以此调用redis。我们稍后再创建这部分内容。
要启动服务,我们只需要在配置中调用redis-server二进制文件。要将其关闭,则可使用Reids的shutdown命令,其可利用redis-cli加以执行。另外,由于我们希望Redis能够在故障情况下得到恢复,因此需要将Restart指令设定为“always”:
/etc/systemd/system/redisservice
[Unit]
Description=Redis In-Memory Data Store
After=networktarget
[Service]User=redisGroup=redisExecStart=/usr/local/bin/redis-server /etc/redis/redisconfExecStop=/usr/local/bin/redis-cli shutdownRestart=always
12345678
最后在[Install]部分,我们将systemd定义为在该服务可用时始终关联(即在引导过程中即行启动):
/etc/systemd/system/redisservice
[Unit]
Description=Redis In-Memory Data Store
After=networktarget
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redisconf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]WantedBy=multi-usertarget
123456789101112131415
完成后保存并退出。
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
概述
在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风险。
2、容量瓶颈。 当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了。当然,你可以重新买个 128G 的新机器。
解决办法
要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络节点上。
Redis 为了解决这个单一节点的问题,也会把数据复制多个副本部署到其他节点上进行复制,实现 Redis的高可用,实现对数据的冗余备份,从而保证数据和服务的高可用。
主从复制
什么是主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的作用
1、数据冗余: 主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复: 当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3、负载均衡: 在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、读写分离: 可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量。
5、高可用基石: 除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
主从复制启用
从节点开启主从复制,有3种方式:
1、配置文件: 在从服务器的配置文件中加入 slaveof<masterip><masterport>。
2、启动命令: redis-server启动命令后加入 --slaveof<masterip><masterport>。
3、客户端命令: Redis服务器启动后,直接通过客户端执行命令 slaveof<masterip><masterport>,则该Redis实例成为从节点。
通过 info replication 命令可以看到复制的一些信息。
主从复制原理
主从复制过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。
在从节点执行 slaveof 命令后,复制过程便开始运作,下面图示可以看出复制过程大致分为6个过程。
主从配置之后的日志记录也可以看出这个流程。
1、保存主节点(master)信息
执行 slaveof 后 Redis 会打印如下日志:
2、从节点与主节点建立网络连接
从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接。
从节点与主节点建立网络连接。
从节点会建立一个 socket 套接字,从节点建立了一个端口为51234的套接字,专门用于接受主节点发送的复制命令。从节点连接成功后打印如下日志:
如果从节点无法建立连接,定时任务会无限重试直到连接成功或者执行 slaveofnoone 取消复制。
关于连接失败,可以在从节点执行 info replication 查看 master_link_down_since_seconds 指标,它会记录与主节点连接失败的系统时间。从节点连接主节点失败时也会每秒打印如下日志,方便发现问题:
3、发送 ping 命令
连接建立成功后从节点发送 ping 请求进行首次通信, ping 请求主要目的如下:
如果发送 ping 命令后,从节点没有收到主节点的 pong 回复或者超时,比如网络超时或者主节点正在阻塞无法响应命令,从节点会断开复制连接,下次定时任务会发起重连。
从节点发送的 ping 命令成功返回,Redis 打印如下日志,并继续后续复制流程:
4、权限验证
如果主节点设置了 requirepass 参数,则需要密码验证,从节点必须配置 masterauth 参数保证与主节点相同的密码才能通过验证。如果验证失败复制将终止,从节点重新发起复制流程。
5、同步数据集
主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点,这部分 *** 作是耗时最长的步骤。
6、命令持续复制
当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。
作者:LoyaltyLu
链接:> 一、目录 1、工具 2、安装tcl 3、安装单机版redis 4、把redis设置为daemon进程,每次系统启动,redis进程一起启动 5、安装redis cluster 二、工具 21、tcl861-srctargz 22、ruby-231targz 23、redis-411gem 24、redis-328targz 25、openssl-102rtargz 三、安装tcl(安装redis必须先要安装tcl) 31、把tcl861-srctargz通过WinSCP上传到虚拟机中的/usr/local目录下 四、安装单机版redis 41、把redis-328targz通过WinSCP上传到虚拟机中的/usr/local目录下 42、依次运行如下命令: tar -zxvf redis-328targz 解压文件 cd redis-328 make && make test && make install 五、把redis设置为daemon进程,每次系统启动,redis进程一起启动 51、将redis的utils目录下的redis_init_script脚本拷贝到linux的/etc/initd目录中,将redis_init_script重命名为redis_6379,6379是我们希望这个redis实例监听的端口号 52、修改redis_6379脚本的第6行的REDISPORT,设置为相同的端口号(默认就是6379) protected-mode no 取消保护模式,保护模式只能127001访问 daemonize yes 让redis以daemon进程运行 pidfile /var/run/redis_6379pid 设置redis的pid文件位置 bind 1921683110 port 6379 设置redis的监听端口号 dir /var/redis/6379 设置持久化文件的存储位置 logfile /var/log/redis/6379log 设置日志文件位置 56、启动redis,依次执行: cd /etc/initd, chmod 777 redis_6379,赋读写执行的权限(chmod -R 777 是递归把该目录下的所有文件和其子文件全部赋权限) /redis_6379 start 启动 57、确认redis进程是否启动,ps -ef | grep redis 58、让redis跟随系统启动自动启动 59、重启系统,不手动启动redis,直接连接redis,可以连接上,表示配置成功 此时一个单机版的redis的生产环境已经搭建好了,每次服务器重启,redis都会自动的启动 六、安装redis cluster (redis cluster集群,要求至少3个master,去组成一个高可用,健壮的分布式的集群,每个master都建议至少给一个slave,3个master,3个slave) 61、前提,我在其它机器上启动了六个redis(安装步骤都如下) 22、创建三个目录: mkdir -p /etc/redis-cluster 存放集群配置信息,自动生成配置 mkdir -p /var/log/redis redis日志 mkdir -p /var/redis/7001 存放redis的rdb文件和aof文件 63、将redis的utils目录下的redis_init_script脚本拷贝到linux的/etc/initd目录中,将redis_init_script重命名为redis_7001,7001是我们希望这个redis实例监听的端口号,并修改redis_7001配置文件中的REDISPORT=7001 64、修改/etc/redis/7001conf中的部分配置为生产环境 65、完成了一个redis环境的配置,依次再配置其余五个,分别为7002、7003、7004、7005、7006,每个启动脚本内,都修改对应的端口号 66、启动6个redis实例 67、创建集群(需要安装ruby、rubygems) 上述命令在部分机器上是可以直接运行完成,成功安装的,但在部分机器上运行第三条命令时会提示ruby版本太低、openssl找不到的问题,下面依次解决这两个问题: 68、再次运行gem install redis命令,报出两个错误 69、再次运行gem install redis命令,报出一个错误 610、再次运行gem install redis命令,报出一个错误 611、再次运行gem install redis命令 [root@ceshi01 local]# gem install redis Successfully installed redis-411 Parsing documentation for redis-411 Done installing documentation for redis after 1 seconds WARNING: Unable to pull data from ' > 以上就是关于Springboot security oauth2 jwt实现权限控制,实现微服务获取当前用户信息全部的内容,包括:Springboot security oauth2 jwt实现权限控制,实现微服务获取当前用户信息、javaspringboot怎么获得根目录sudo读写权限、如何在Ubuntu 16.04上安装并配置Redis等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力! 欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)