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

流程一致性

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

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

Spring Security匿名用户

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

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

匿名用户的配置

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

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

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

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

http.authorizeRequests().mvcMatchers("/anonymous0").access("hasAuthority('ROLE_USER')").mvcMatchers("/anonymous1").hasAuthority("ROLE_ANONYMOUS").mvcMatchers("/anonymous2").hasRole("ANONYMOUS").mvcMatchers("/anonymous3").access("isAnonymous()").mvcMatchers("/anonymous4").access("IS_AUTHENTICATED_ANONYMOUSLY").mvcMatchers("/anonymous5").anonymous()

获取匿名用户

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

@GetMapping("/")
public String method(Authentication authentication) {if (authentication instanceof AnonymousAuthenticationToken) {return "anonymous";} else {return "not anonymous";}
}

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

@GetMapping("/")
public String method(@CurrentSecurityContext SecurityContext context) {Authentication authentication = context.getAuthentication()if (authentication instanceof AnonymousAuthenticationToken) {return "anonymous";} else {return "not anonymous";}
}

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

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

2022-01-18

欢迎加入胖哥技术内卷群

2022-01-14

为什么要设计匿名用户相关推荐

  1. 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统

    一.前言 在大型的信息管理系统中,经常涉及到权限管理系统 下面来个 demo,很多复杂的系统的设计都来自它 代码已经放到github上了,地址:https://github.com/larger5/s ...

  2. vsftp匿名访问目录_vsftpd配置禁用匿名用户并设置登陆用户

    vsftpd是一个linux的ftp服务器,启动这个服务后,默认开启了匿名用户登陆,可以按照以下方式禁用匿名用户并设置登陆用户. vsftpd禁用匿名用户 修改vasftpd服务的配置文件/etc/v ...

  3. MySQL删除匿名用户,保证登录安全

    博客地址已迁往 www.virtclouds.com 原文地址 http://www.virtclouds.com/538.html 很多MySQL程序都会带有匿名登录的功能. 在刚刚安装完MySQL ...

  4. django 限制匿名用户访问以及重定向

    在某些页面中,我们不希望匿名用户能够访问,例如个人页面等,这种页面只允许已经登录的用户去访问,在django中,我们也有比较多的方式去实现. 最简单的,我们在viewz中去判断用户is_authent ...

  5. linux添加匿名用户,vsftpd3.0之匿名用户配置

    有时候工作中为了方便上传下载文件,又不想在系统中添加用户并为用户创建密码,这时候就可以用匿名用户方式搭建FTP服务器,当然安全性我们不说,今天就为实现这么个简单而粗爆的FTP服务器,来看看都需要哪些配 ...

  6. 性能测试场景设计之用户模式设置

    性能测试场景设计之参数设计 1.用户模式设置 场景执行前需要根据系统特性对场景进行配置,以便对系统进行负载测试时压力状况更加符合业务特性.相关的参数配置如下: 首先新建场景,如下: 场景新建的时候一般 ...

  7. vsftpd匿名用户上传和下载的配置

    看到很多朋友配置vsftpd时不能使用匿名用户上传和下载(创建目录或删除.重命名文件夹),本文主要解决vsftpd的匿名用户权限配制问题. 配置要注意三部分,请一一仔细对照: 1.vsftpd.con ...

  8. 网站推广怎样实现网站设计吸引用户注意完成网站推广指标?

    一般情况下想要实现网站推广必然要有吸引用户注意的关键点,如果用户在浏览网站期间没有足够吸引注意的点,用户则会转向其他同类型网站进行访问,导致网站在无形当中流失潜在用户群体,也就是说站长是无法完成网站推 ...

  9. 【Android 逆向】Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )

    文章目录 一.Linux 权限简介 二.系统权限 / 用户权限 / 匿名用户权限 1.系统权限 2.用户权限 3.匿名用户权限 一.Linux 权限简介 Linux 是基于文件的系统 , 内存 , 设 ...

最新文章

  1. 百度地图轨迹回放,自定义路书,边走边画线
  2. 西农大许金荣课题组在小麦赤霉病研究领域取得重要突破
  3. 《预训练周刊》第5期:智源等研究力证:GPT语言理解能力不输BERT、盘点NLP预训练「兵器谱」...
  4. 【Android开发】Android 删除指定文件和文件夹
  5. php json转数组后并在前端展示,0516-如何从服务器端获取JSON格式字符串并解决到前端页面中显示...
  6. 【阿里云域名】我都有服务器了,为什么还要购买域名?
  7. 3.1.1 内存的基础知识
  8. 5张图搞懂Java深浅拷贝
  9. 字节跳动 Flink 单点恢复功能实践
  10. dsa java_将Java转换为python DSA签名
  11. PHP自动测试框架Top 10
  12. 参数详解 复制进程_如何优化PostgreSQL逻辑复制
  13. 长连接和Keepalive详解
  14. Java反转单链表(code)
  15. [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]
  16. python如何运行一个python程序_在python中,如何运行一个命令行程序,它在发送Ctrl+D之前不会返回...
  17. 进程和线程相关小知识
  18. html里面textfield属性,StyleableTextField的CSS属性htmlText
  19. matlab 通信工程,MATLAB 通信工程仿真
  20. bzoj2958: 序列染色3269: 序列染色

热门文章

  1. Glide 加载Gif 导致cpu居高不下的解决办法
  2. 2022年1月上市公司舆情事件月报
  3. Java开源技术分享:使用TopCode实现手指跟踪
  4. 2018最新Android 面试指南
  5. 【MySQL】多表查询
  6. flink on yarn集群搭建
  7. React教程(二)——jsx语法、条件渲染、列表渲染
  8. 修复软件bug通用解决方案?
  9. 【Fast RTPS】入门--------Ubuntu系统下
  10. confluent mysql_基于Confluent Mysql Binlog 数据遇到的问题以及解决方式