通常认为采用“默认拒绝”是一种良好的安全实践,在这种情况下,您可以明确指定允许的内容,并禁止其他内容。定义未经身份验证的用户可以访问的内容也是类似的情况,特别是对于 web 应用程序。许多站点要求用户必须对除了一些 url (例如主页和登录页面)以外的任何内容进行身份验证。在这种情况下,为这些特定 url 定义访问配置属性比为每个安全资源定义访问配置属性更容易。换句话说,有时候说 role_something 是默认需要的,并且只允许该规则的某些异常,比如用于应用程序的登录、注销和主页。您还可以从过滤器链中完全省略这些页面,从而绕过访问控制检查,但这可能由于其他原因而不可取,特别是如果页面对于经过身份验证的用户的行为不同。

这就是我们所说的匿名身份验证。注意,在“匿名身份验证”用户和未经身份验证的用户之间没有真正的概念差异。Spring Security 的匿名身份验证为您配置访问控制属性提供了更方便的方法。例如,对于 getCallerPrincipal 等 servlet API 的调用仍然返回 null,即使 SecurityContextHolder 中实际上存在匿名身份验证对象。

在其他情况下,匿名身份验证也很有用,例如审计拦截器查询 SecurityContextHolder 以确定哪个主体负责给定的操作。如果类知道 SecurityContextHolder 总是包含一个 Authentication 对象,而且从不使用 null,则可以更有效地创建类。

Configuration

当使用 HTTP 配置 Spring Security 3.0时,会自动提供匿名身份验证支持,并且可以使用 < Anonymous > 元素进行定制(或禁用)。您不需要配置这里描述的 bean,除非您使用传统的 bean 配置。

共同提供匿名身份验证特性的三个类。Token 是身份验证的一个实现,它存储应用于匿名主体的 GrantedAuthoritys。有一个相应的 AnonymousAuthenticationProvider,它被链接到 ProviderManager 中,以便 AnonymousAuthenticationToken 被接受。最后,还有一个 AnonymousAuthenticationFilter,它被链接在正常的身份验证机制之后,如果没有现有的身份验证,它会自动向 SecurityContextHolder 添加 AnonymousAuthenticationTokens 。过滤器和身份验证提供者的定义如下:

<bean id="anonymousAuthFilter"class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter">
<property name="key" value="foobar"/>
<property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/>
</bean><bean id="anonymousAuthenticationProvider"class="org.springframework.security.authentication.AnonymousAuthenticationProvider">
<property name="key" value="foobar"/>
</bean>

密钥在过滤器和身份验证提供者之间共享,以便前者创建的标记被后者接受[1]。userAttribute 以 usernameInTheAuthenticationToken,grantedAuthority [ ,grantedAuthority ]的形式表示。这与 InMemoryDaoImpl 的 userMap 属性的等号后面使用的语法相同。

如前所述,匿名身份验证的好处是所有 URI 模式都可以应用安全性。例如:

<bean id="filterSecurityInterceptor"class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
<property name="securityMetadata"><security:filter-security-metadata-source><security:intercept-url pattern='/index.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/><security:intercept-url pattern='/hello.htm' access='ROLE_ANONYMOUS,ROLE_USER'/><security:intercept-url pattern='/logoff.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/><security:intercept-url pattern='/login.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/><security:intercept-url pattern='/**' access='ROLE_USER'/></security:filter-security-metadata-source>" +
</property>
</bean>

AuthenticationTrustResolver

有关匿名身份验证的讨论的最后一个例子是AuthenticationTrustResolver接口,以及它对应AuthenticationTrustResolverImpl实现。该接口提供了isAnonymous(身份验证)方法,它允许感兴趣的类考虑这种特殊类型的身份验证状态。ExceptionTranslationFilter在处理AccessDeniedExceptions时使用此接口。如果抛出AccessDeniedException异常,并且身份验证是匿名类型的,则筛选器不会抛出403(禁止)响应,而是开始AuthationEntryPoint,以便主体可以正确地进行身份验证。
这是一个必要的区别,否则主体将始终被认为是“经过身份验证的”,并且永远不会有机会通过表单、基本、摘要或一些其他正常的身份验证机制进行登录。

您经常会看到上述拦截器配置中的ROLE_ANONYMONY属性被替换为IS_AUTHENTIAD_ANAMENTIAL,这在定义访问控制时实际上是相同的。这是一个使用身份验证Voter的示例,我们将在授权一章中看到。它使用身份验证TrustResolver来处理此特定配置属性,并向匿名用户授予访问权限。AuthatedVoter方法更强大,因为它允许您区分匿名、记住我和完全经过身份验证的用户。但是,如果您不需要这个功能,那么您可以坚持使用ROLE_ANONYMON,它将由Spring Security的标准RoleVoter处理。

使用 Spring MVC 获取匿名认证

Springmvc 使用自己的参数解析器解析 Principal 类型的参数。

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

将始终返回“not anonymous”,即使对于匿名请求也是如此。其原因是,Spring MVC使用HttpServletRequestgetMaster来解析参数,当请求是匿名的时,该参数为空。
如果你想在匿名请求中获得身份验证,可以使用@CurrentSecurityContext:

@GetMapping("/")
public String method(@CurrentSecurityContext SecurityContext context) {return context.getAuthentication().getName();
}

[1] 使用密钥财产不应被视为在这里提供任何真正的安全。这只是一项记账工作。如果在身份验证客户端可以构造身份验证对象(例如使用RMI调用)的场景中共享包含匿名身份验证提供者的ProviderManager,则恶意客户端可能会提交自己创建的匿名身份验证令牌(带有选定的用户名和授权列表)。如果密钥是可猜测的或可以找到的,则该令牌将被匿名提供者接受。这对于正常使用来说不是问题,但如果您使用的是RMI,那么最好使用定制的ProviderManager,它省略了匿名提供者,而不是共享您用于HTTP身份验证机制的提供者。

参考 SpringSecurity 官方文档

匿名认证(Anonymous Authentication)相关推荐

  1. Spring Security 匿名认证

    1.项目截图: 2.匿名认证配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...

  2. Java-SpringBoot:用户认证(Authentication)和用户授权(Authorization)

    Java-SpringBoot-2 学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV1PE411i7CV 学习文档: 微信公众号 狂神说 –htt ...

  3. HTTP基础认证Basic Authentication

    HTTP基础认证Basic Authentication Basic Authentication是一种HTTP访问控制方式,用于限制对网站资源的访问.这种方式不需要Cookie和Session,只需 ...

  4. [转]asp.net权限认证:摘要认证(digest authentication)

    本文转自:http://www.cnblogs.com/lanxiaoke/p/6357501.html 摘要认证简单介绍 摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密 ...

  5. authentication java_HTTP基本认证(Basic Authentication)的JAVA实例代码

    大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证. 下面来看看一看这个认证的工作过程: 第一步:客户端发送h ...

  6. TFS(Visual Studio Team Services) / Azure Devops git认证失败 authentication fails 的解决方案 http协议

    TFS(Visual Studio Team Services) / Azure Devops git认证失败 authentication fails 的解决方案 http协议 参考文章: (1)T ...

  7. asp.net权限认证:摘要认证(digest authentication)

    摘要认证简单介绍 摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密码的泄露 之前对摘要认证也不是很熟悉,还得感谢圆中的 parry 贡献的博文:ASP.NET Web AP ...

  8. <物联网>emqx服务器关闭匿名认证并开启ClientId认证

    文章目录 一.前言 二.知识储备 三.设置认证 1.开启ClientId认证 2.关闭匿名认证 3.其他认证方式 闲谈 一.前言 EMQX服务器默认情况是允许任意客户端接入的(只要获得服务器IP地址和 ...

  9. 第四章:Shiro的身份认证(Authentication)

    Authentication概述 概述 Authentication 是指身份验证的过程--即证明一个用户实际上是不是他们所说的他们是谁.也就是说通过提交用户的身份和凭证给Shiro,以判断它们是否和 ...

最新文章

  1. 2014-01-04 SQL练习
  2. 用Asp.net实现简单的文字水印
  3. 社交系统/社群系统ThinkSNS+ alpha.2 版本发布!
  4. 远程java接口说明
  5. map初始化_您可曾这样初始化一个map呢?
  6. android 模糊度处理_图像处理评价指标之模糊度、清晰度(待更新)
  7. 创建使用 Active Directory 模式隔离用户的新 FTP 站点
  8. 做虚拟化服务器的配资一致嘛,服务器虚拟化技术在校园网管理中的应用探讨.pdf...
  9. RS(1)--10分钟了解什么是推荐系统
  10. 前、后端分离权限控制设计与实现
  11. 10W 赞的程序员高薪职业建议
  12. Python接口自动化-接口基础(二)
  13. 百度云盘登录二维码刷不出来
  14. python音标1003python音标_词汇小助手V1.2——可以显示英语单词的国际音标
  15. android textview左边图片,Android TextView 多种方式显示图片-Fun言
  16. c 语言 组合数,C++中求组合数的各种方法总结详解
  17. win10系统wifi能连上但不能上网怎么办
  18. 用累积分布函数(CDF)计算期望
  19. 服务器导出连接日志文件,Windows文件共享日志审计功能及输出到syslog服务器
  20. 企业wifi统一认证怎样呀

热门文章

  1. C#与Word文档的交互
  2. Flutter环境搭建、运行gallary项目
  3. win10主题更换_利用termuxapi手机定时更换网络随机壁纸;免费申请小米收款宝
  4. 用STM32CubeMX生成STM32F407ZG + LAN8720A 的LWIP
  5. 日本語トレーニング44
  6. 二维数组8:设计题 RingBuffer的原理和实现
  7. PMP常考知识点核对单-10.沟通管理
  8. html5手指滑动图片放大缩小,移动端如何实现图片通过捏合手势放大缩小呢?
  9. 名帖366 鲜于枢 草书《韩愈石鼓歌》
  10. 磁盘阵列(RAID)级别的简单介绍