Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

第一次请求失败了 打印出了403,第二次更新成功

Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
现在只处理了403这种情况,还有一种情况就是401,就是当前用户需要做身份认证,你没有做身份认证。

401的处理

与403类似,也是在这里配置。EntryPoint入口点。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
这个方法里面,我们要实现的接口是AuthenticationEntryPoint
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
不直接实现这个接口,而是继承一个父类。OAuth2AuthenticationEntryPoint
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
上面如果不配置。那么默认的实现就是OAuth2AuthenticationEntryPoint。它的默认实现就是返回一个401的错误码。然后返回一个和403类似的json
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

令牌随便加个1
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
这样就抛出401 的错误。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
401的这段信息就是OAuth2AuthenticationEntryPoint来处理的
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
加上@Component声明称Spring的Bean
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
覆盖的方法commence
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
注入到配置类Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

重启网关测试

Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
401的处理要比403复杂一些, 一会我们会看到一些场景。

首先是发过来的令牌是有问题的,在令牌的前面加了一个1
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
返回的结果就是401
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
我们在后台日志里可以看到 ,只有一行日志
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
这说明我的请求进入到认证的过滤器以后,因为令牌有问题所以认证的 那个过滤器 直接抛了异常。
异常抛给了AuthenticationEntryPoint。它来处理,就输出了一行日志。然后整个处理就结束掉了。然后返回了错误信息。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
在这种情况下,实际上你的请求就没有经过日志的Filter,也就是这个GatewayAuditLogFilter。而是直接从认证 的过滤器,直接抛异常。然后就走掉了。 这是一种情况。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
另外一种情况:不传令牌,直接访问
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
多发几次请求。多点击几次请求的按钮。返回的永远是401
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

后台的日志里,出现了两种情况

anonymousUser是一个匿名的用户。因为没有传任何的令牌,所以实际上是一个匿名的用户,因为没传令牌,认证的过滤器默认建了一个匿名的用户身份放在他的authentication里面了。仍然往下走,走过了日志的过滤器。也走到了权限的判断,但是用的身份是匿名用户的身份。50%的概率,这里判断成功了。 请求放过去就执行了update log to success
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
那么4-1是哪里来的呢,是订单的服务,是需要身份认证的,返回了401,是在网关阶段判断出了没有权限。于是返回了401
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

两种情况:1.请求匿名的被刚过去,后面的order的服务返回401. 2。是网关这里权限没过,返回了401

1.令牌有问题,2。没传令牌。权限之类被拦住

一种情况不过日志的过滤器。另一种是过日志的过滤器

分别处理两种情况

最开始是这么配置的,一定要身份认证通过后,才能访问我们的这些请求
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
经过改造我们用了permissionService
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
permissonService里面没有做是不是登陆了的判断。而是直接是一个随机数。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
首先我们要把当前用户是不是登陆的判断加上。判断传进来的authentication就可以了
如果令牌是正确有效的,那么这里的authentication是一个oauth2的authentication,如果没带令牌,就是匿名的用户的情况,那么这里的authentication是一个匿名的authentication。所以这里只需要判断authentication的类型就看可以了。

所以这里判断如果当前的authentication是AnonymousAuthenticationToken匿名的 那么就抛出异常 必填的AccessToken的异常,
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
它的参数是当前服务的detials,这里直接传空就可以了
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
这个EntryPoint是用来处理401错误的。讲了401有两种情况。
1.是传的令牌有问题,无法解析,就直接从认证的过滤器里面抛异常,抛异常服务就断了,不往下走 了。

Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
2.是没传令牌.以为anoymous的身份往下走。最后到PermissionService里面抛出一个AccessTokenRequiredException
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
所以这里的authException有两种情况。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
一种是这里抛出的AccessTokenRequiredException。如果是这个exception,我认为你是没传令牌 ,如果不是这个异常,我就认为你传的令牌有问题
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
如果是这种异常,说明你没传令牌,而且你的请求是经过了日志服务器,日志服务器已经往数据库插入了一条记录了。所以这里就是更新log为401
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
如果不是这个,说明你的令牌本身是有问题的,这个时候不会过日志的Filter。所以这里就是add一个401的log。令牌有问题。Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

重启网关测试


收下令牌前面加个1
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

前台的相应是401
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
控制台的输出是 add一个401的log。表示这次传的令牌有问题。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

令牌去掉再去访问
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

没带令牌的后台输出。没带令牌是可以经过认证的Filter的,是一个匿名的身份。进入到日志Filter里面去。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
在oder服务里面判断权限有问题。
Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
这就是整个日志的处理。

结束




 

上一篇:PHP登录脚本和SQL查询始终返回相同的用户ID


下一篇:java-Web服务用户身份验证和会话管理的最佳实践