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对象,如图

用到几个都可以

不叫AccessToken和Authorization也可以

我给你简单讲下这两个东西是为了做什么吧

首先这一般用在RESTFUL风格的无状态通讯中啥意思呢就是说不用Session这种传统的标记,来表达"用户是谁"用户每一次的请求访问都没有这个session状态的时候就叫做无状态

那么没有session之后,服务器怎么知道访问者到底是谁,是哪个账号呢

那么就需要约定出来一个临时通行证token

用户在登录页,用账号密码进行登录然后服务器临时生成一个token或者AccessToken或者Authorization再或者lalalademaxiya,随便你叫什么名字,你只需要知道这个东西就是一个临时的身份z明就可以了

然后用户后续的请求访问,就带上这个临时证明,(不能每次访问都传账号密码,太不安全了,所以采用临时身份z)

服务器收到请求后,从请求头里面拿出token,或者你这个AccessToken,都可以,看你叫什么名字再从自己的内存队列中查询,是否包含这个token,以及这个token对应哪个User在决定这个用户能做什么,后续业务怎么进行

(一般这种情况我们放在拦截器里面做,拦截器拦截所有>

magic-api 是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为>

1注册网站相关账号,拿到 API_Key , Secret_Key

2获取token

想授权地址 >

在局域网下,前端页面请求时在请求头里携带token信息,后台获取不到header里的token参数

debug查看了下返回的request参数

用postman调接口的request参数

发现cors跨域复杂请求会先发送一个方法为OPTIONS的预检请求,这个请求是用来验证本次请求是否安全的

第二个过滤器判断token时会把预请求当做真正的请求去判断,所以在第二个过滤器判断token之前先判断是不是预请求OPTIONS,不是则验证token,是则放行。

在判断token之前加判断语句

token和session都可以用来做身份验证,而session用多了,对服务器的压力是很大的。

这里主要是生成一个uuid作为账户的身份令牌,用来校验用户是否登录。

项目里有用MyBatis-Plus,先简单说下MyBatis-Plus的配置,如果是用Mybatis之类的可以直接跳过这些配置

maven依赖相应的包

配置文件:

mybatis-plus配置

用户 实体类

用户Token

@Data 是lombok插件的注解,自动生成get、set、toString等

注意如果用了MyBatis-Plus创建的实体类必须加@TableName注解,否则会报错,当然你也得去建相应的表

配置一个自定以注解:@Login, 只要加了这个注解的就会校验用户的Token。

@LoginUser 用来获取用户信息,需要的话可以配置,也可以忽视的。

用户登录的时候给当前用户生成或修改token

controller

service

生成token createToken(long id),登出的时候调expireToken(long userId) 使当前用户的token失效时间设置为当前时间

当然还需要配置一个拦截器,拦截只要加了@Login注解的方法就会校验用户的token

拦截器:

@LoginUser 获取用户信息

WebMvcConfigurer

需要注意的是/ 不可以设置为/demo/ ,/demo 为context-path 否则会使拦截器失效

异常处理器

在swagger配置里添加securitySchemes 可以在swagger页面设置header

访问接口没有设置token的时候

获取token

将其复制粘贴到

以上就是关于Springboot security oauth2 jwt实现权限控制,实现微服务获取当前用户信息全部的内容,包括:Springboot security oauth2 jwt实现权限控制,实现微服务获取当前用户信息、请问header中的AccessToken属性和Authorization属性服务器应该如何处理、magic-api 快速接口开发等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存