Springboot security oauth2 jwt实现权限控制,实现微服务获取当前用户信息

Springboot security oauth2 jwt实现权限控制,实现微服务获取当前用户信息,第1张

在原先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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9329678.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)