社区编辑申请
注册/登录
聊聊我们为什么要设计匿名用户
开发 架构
匿名用户是很多同学不理解的一个概念,这一章胖哥尝试来解读一下匿名用户,希望能帮你更好的理解这个概念。

匿名用户是很多同学不理解的一个概念,这一章胖哥尝试来解读一下匿名用户,希望能帮你更好的理解这个概念。

流程一致性

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

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

Spring Security匿名用户

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

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

匿名用户的配置

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

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

权限控制只需要针对ROLE_ANONYMOUS进行限制即可,也可以通过认证投票器AuthenticatedVoter的IS_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";
}
}

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



责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2022-05-18 23:42:08

网络安全安全分析工具

2022-05-24 08:21:16

数据安全API

2022-05-11 14:48:33

腾讯云寿险民生保险

2022-05-09 11:19:12

CSS函数开源

2022-05-16 08:50:23

2022-05-10 14:11:05

网络安全网络犯罪

2022-05-23 10:55:19

华为数字化转型架构蓝图

2022-05-10 08:59:25

2022-04-02 10:23:12

MySQL数据库

2022-05-26 07:18:54

Windows 11RTM22H2

2022-05-26 11:37:58

亚马逊云科技C7g实例

2022-05-17 08:39:05

VueViteTypeScript

2022-05-11 15:08:52

驱动开发系统移植

2022-05-22 21:23:10

前端监控系统

2022-05-25 10:04:43

Go编程

2022-05-16 07:35:21

Windows远程桌面远程服务器

2022-05-20 08:17:43

Java日志

2022-05-20 14:08:13

Web3元宇宙区块链

2022-04-11 07:50:58

2022-04-14 12:24:20

同话题下的热门内容

架构师必备:多维度查询的优秀实践快手一面:讲一讲 Hadoop、Hive、Spark 之间的关系?分布式系统之Sentinel介绍与使用图解 Kafka 生产者元数据拉取管理全流程链路追踪:Sleuth整合ZipKinSOA中的软件架构设计及软硬件解耦方法论链路追踪:项目整合Sleuth实现链路追踪Spring框架之Bean Scope

编辑推荐

终于有人把Elasticsearch原理讲透了!花了一个星期,我终于把RPC框架整明白了!拜托!面试不要再问我Spring Cloud底层原理陌陌基于K8s和Docker容器管理平台的架构实践收藏 | 第一次有人把“分布式事务”讲的这么简单明了
我收藏的内容
点赞
收藏

51CTO技术栈公众号