匿名认证

对于匿名访问的用户,Spring Security 支持为其建立一个匿名的 AnonymousAuthenticationToken 存放在 SecurityContextHolder 中,这就是所谓的匿名认证。这样在以后进行权限认证或者做其它操作时我们就不需要再判断 SecurityContextHolder 中持有的 Authentication 对象是否为 null 了,而直接把它当做一个正常的 Authentication 进行使用就 OK 了。

配置

使用 NameSpace 时,http 元素的使用默认就会启用对匿名认证的支持,不过我们也可以通过设置 http 元素下的 anonymous 元素的 enabled 属性为 false 停用对匿名认证的支持。以下是 anonymous 元素可以配置的属性,以及它们的默认值。

      <security:anonymous enabled="true" key="doesNotMatter" username="anonymousUser" granted-authority="ROLE_ANONYMOUS"/>

key 用于指定一个在 AuthenticationFilter 和 AuthenticationProvider 之间共享的值。username 用于指定匿名用户所对应的用户名,granted-authority 用于指定匿名用户所具有的权限。

与匿名认证相关的类有三个,AnonymousAuthenticationToken 将作为一个 Authentication 的实例存放在 SecurityContextHolder 中;过滤器运行到 AnonymousAuthenticationFilter 时,如果 SecurityContextHolder 中持有的 Authentication 还是空的,则 AnonymousAuthenticationFilter 将创建一个 AnonymousAuthenticationToken 并存放在 SecurityContextHolder 中。最后一个相关的类是 AnonymousAuthenticationProvider,其会添加到 ProviderManager 的 AuthenticationProvider 列表中,以支持对 AnonymousAuthenticationToken 的认证。AnonymousAuthenticationToken 的认证是在 AbstractSecurityInterceptor 中的 beforeInvocation() 方法中进行的。使用 http 元素定义时这些 bean 都是会自动定义和添加的。如果需要手动定义这些 bean 的话,那么可以如下定义:

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

key 是在 AnonymousAuthenticationProvider 和 AnonymousAuthenticationFilter 之间共享的,它们必须保持一致,AnonymousAuthenticationProvider 将使用本身拥有的 key 与传入的 AnonymousAuthenticationToken 的 key 作比较,相同则认为可以进行认证,否则将抛出异常 BadCredentialsException。userAttribute 属性是以 usernameInTheAuthenticationToken,grantedAuthority[,grantedAuthority] 的形式进行定义的。

AuthenticationTrustResolver

AuthenticationTrustResolver 是一个接口,其中定义有两个方法,isAnonymous() 和 isRememberMe(),它们都接收一个 Authentication 对象作为参数。它有一个默认实现类 AuthenticationTrustResolverImpl,Spring Security 就是使用它来判断一个 SecurityContextHolder 持有的 Authentication 是否 AnonymousAuthenticationToken 或 RememberMeAuthenticationToken。如当 ExceptionTranslationFilter 捕获到一个 AccessDecisionManager 后就会使用它来判断当前 Authentication 对象是否为一个 AnonymousAuthenticationToken,如果是则交由 AuthenticationEntryPoint 处理,否则将返回 403 错误码。

最新文章

  1. HDOJ 4770 Lights Against Dudely
  2. Broadcom以太网交换芯片培训
  3. iphone 3gs 美版,6.1.3+降基带+越狱+解锁。成功分享(转)
  4. 关于Datagridview控件用法的一些总结(设置列chicun)
  5. 题目:打印出所有的 &quot;水仙花数 &quot;,所谓 &quot;水仙花数 &quot;是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 &quot;水仙花 数 &quot;,因为153=1的三次方+5的三次方+3的三次方。
  6. ArcGIS10.2最新全套下载地址
  7. [转载]jquery tmpl使用方法
  8. android MediaCodec 音频编解码的实现——转码
  9. 提高PHP性能的方法技巧
  10. 解析Function.prototype.bind
  11. mysql commit 和 rollback
  12. 利用Pluggable Protocol实现浏览器打开本地应用程序
  13. sql 语句按字段指定值排序及分页
  14. 阿里Dragonfly docker p2p 镜像分发试用
  15. 常用js对象、数组、字符串的方法
  16. YII登陆错误 mcrypt_create_iv()
  17. 2018.10.19 NOIP训练 变化的序列(线性dp)
  18. 2018.08.17 洛谷P3110 [USACO14DEC]驮运(最短路)
  19. poj 1156 Palindrome
  20. redis存session问题测试内容

热门文章

  1. Python 从入门到入门基础练习十五题
  2. comfirm 方法显示对话框
  3. Unity3D项目程序加密-VirboxProtector加壳工具
  4. 关于IPFS, 你想知道的都在这里
  5. 【数据库】MySQL中的共享锁与排他锁
  6. JVM内存管理概述与android内存泄露分析
  7. “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift
  8. x64系统安装ODAC问题经验分享
  9. Beta预备
  10. MySQL的小Tips