匿名用户是很多同学不理解的一个概念。本章胖哥尝试对匿名用户进行解释,希望能帮助大家更好地理解这个概念。过程一致性通常所有资源访问都应该是有条件的。用于验证这些条件的过程也应该是一致的。让我们看一个现实生活中的例子。老王是一家公司的老板。他的车进地下车库是免费的,其他人进地下车库是收费的。让我们想想如何实现这个需求。如果流程不一致,需要两个通道,一个是vip通道(让老王走),一个是public通道(给其他人),这两个通道的维护成本会很高,有些人会经常走错路,甚至引起不满,何必搞特权;如果流程一致,这件事情就会简单很多,无论谁进入停车场都按照相同的通道流程,只需要维护一个VIP标签,成本大大降低,流程也简化了,而且看来老王一点架子都没有。这个VIP标签就是所谓的“匿名用户”。SpringSecurity匿名用户Anonymous用户是SpringSecurity中专门设计的。它的作用其实就是在保证流程一致性的前提下,执行一些特殊的认证逻辑,比如程序的登录,首页的数据接口等。这些未经身份验证的用户场景需要绕过访问控制检查,这可以通过引入一个特殊的“匿名身份”来实现,匿名用户可以做什么和不能做什么可以很容易地定义,这就是我们所说的匿名身份验证。请注意:“匿名身份验证”用户和未身份验证用户之间没有真正的区别,您可以将匿名用户视为未身份验证用户,也可以将匿名用户视为在执行匿名身份验证流用户后进行身份验证.匿名用户的配置匿名用户是认证系统中的最后一个认证过程。负责匿名认证的过滤器是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()获取匿名用户SpringMVC使用自己的参数解析器获取当前Principal:@GetMapping("/")publicStringmethod(Authenticationauthentication){if(authenticationinstanceofAnonymousAuthenticationToken){返回“匿名”;}else{返回“非匿名”;}}上述方法将始终返回非匿名,即使对于匿名请求也是如此。如果你想获得匿名请求的身份验证,请改用@CurrentSecurityContext:@GetMapping("/")publicStringmethod(@CurrentSecurityContextSecurityContextcontext){";}else{返回“非匿名”;}}你有想过其他获取匿名用户的方法吗?
