为什么要设计匿名用户

举报
码农小胖哥 发表于 2022/04/01 00:53:28 2022/04/01
【摘要】 匿名用户是很多同学不理解的一个概念,这一章胖哥尝试来解读一下匿名用户,希望能帮你更好的理解这个概念。点赞、再看、转发走一波。 流程一致性 通常情况下所有的资源访问都应该是有条件的。用来验证这些条件的流程也应该是一致的。我们来看实际生活中的一个例子,老王是一家公司的老板,他的车进地下车库是免费的,其他人进地下车库是计费的。我...

429039298fe2dc6e7b2db63000eb5acd.gif

匿名用户是很多同学不理解的一个概念,这一章胖哥尝试来解读一下匿名用户,希望能帮你更好的理解这个概念。点赞、再看、转发走一波。

流程一致性

通常情况下所有的资源访问都应该是有条件的。用来验证这些条件的流程也应该是一致的。我们来看实际生活中的一个例子,老王是一家公司的老板,他的车进地下车库是免费的,其他人进地下车库是计费的。我们来思考如何实现这个需求。

如果流程不一致的话,需要两条道,一条是VIP通道(让老王走),一条是大众通道(给其他人用),这两个通道的维护成本会很高,还有人会经常走错道,甚至招致不满,凭啥他要搞特权;如果流程一致,这事就好办多了,不管是谁都得按同一个通道流程进入停车场,只需要维护一个VIP标签就行了,成本大大降低,流程也简化了,还显得老王没有架子。这个VIP标签就是所谓的“匿名用户”。

Spring Security匿名用户

Spring Security中专门设计了匿名用户,它的作用其实也是为了在保证流程一致的前提下去执行一些特殊的认证逻辑,比如程序的登录、主页的数据接口,这些未认证的用户场景需要绕过访问控制检查,通过引入一个特殊的“匿名身份”可以做到这一点,匿名用户可以做什么、不可以做什么都可以轻松定义, 这就是我们所说的匿名身份验证。

请注意:“经过匿名身份验证”的用户和未经身份验证的用户之间没有真正的差异,你可以认为匿名用户就是未认证用户,你也可以认为匿名用户是执行了匿名认证流程后的认证用户。

匿名用户的配置

匿名用户是认证体系最后的一道认证流程,负责匿名认证的过滤器是AnonymousAuthenticationFilter,当发现请求不具备任何其它认证条件后,会生成一个AnonymousAuthenticationToken,它包含三个属性:

6b41fa1563f5866f694bbbecae405a99.png

keyHash 仅仅在AnonymousAuthenticationFilterAnonymousAuthenticationProvider之间共享, 以避免一些恶意客户端去伪造AnonymousAuthenticationToken

权限控制只需要针对ROLE_ANONYMOUS进行限制即可,也可以通过认证投票器AuthenticatedVoterIS_AUTHENTICATED_ANONYMOUSLY属性来限制。

下面这几种配置都可以用来控制匿名用户的访问权限:


   
  1. http
  2.                 .authorizeRequests()
  3.                 .mvcMatchers("/anonymous0").access("hasAuthority('ROLE_USER')")
  4.                 .mvcMatchers("/anonymous1").hasAuthority("ROLE_ANONYMOUS")
  5.                 .mvcMatchers("/anonymous2").hasRole("ANONYMOUS")
  6.                 .mvcMatchers("/anonymous3").access("isAnonymous()")
  7.                 .mvcMatchers("/anonymous4").access("IS_AUTHENTICATED_ANONYMOUSLY")
  8.                 .mvcMatchers("/anonymous5").anonymous()

获取匿名用户

Spring MVC中使用它自己的参数解析器来获取当前Principal


   
  1. @GetMapping("/")
  2. public String method(Authentication authentication) {
  3.  if (authentication instanceof AnonymousAuthenticationToken) {
  4.   return "anonymous";
  5.  } else {
  6.   return "not anonymous";
  7.  }
  8. }

以上方式将永远返回not anonymous,即使是匿名请求。如果您想获取匿名请求的Authentication,请改用@CurrentSecurityContext


   
  1. @GetMapping("/")
  2. public String method(@CurrentSecurityContext SecurityContext context) {
  3.     Authentication authentication = context.getAuthentication()
  4.     if (authentication instanceof AnonymousAuthenticationToken) {
  5.   return "anonymous";
  6.  } else {
  7.   return "not anonymous";
  8.  }
  9. }

你想一想还有没有其它方式去获得匿名用户?

Java的前沿分享(1):value或许成为java的新关键字

2022-01-18

802112a568bba253dfcdacbf3f718bbe.png

欢迎加入胖哥技术内卷群

2022-01-14

80c2c8d0571aa29fb5ca84e2efef71e4.png

696ebe6ff22a18ac70ee26c5a4fae8cd.gif

文章来源: felord.blog.csdn.net,作者:码农小胖哥,版权归原作者所有,如需转载,请联系作者。

原文链接:felord.blog.csdn.net/article/details/122593062

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。