SecurityContextHolder, SecurityContext and Authentication Objects
2015-10-12 21:31
686 查看
[b]SecurityContextHolder, SecurityContext and Authentication Objects[/b]
最重要并且最根本的object是SecurityContextHolder,我们将当前应用security上下文的所有数据保存在里面,这些数据包括应用系统中使用的principle数据。SecurityContextHolder默认使用ThreadLocal局部变量保存这些数据,这意味着security上下文对于相同的正在执行的线程的方法是可用的,即使security上下文没有显式地将参数传递给这些方法,如果希望在当前principal请求处理完毕后要清理这些线程,这样使用ThreadLocal局部变量会是非常安全的。当然,Spring Security会自动的处理这些问题,所以你不需要有任何的担心。
一些应用不一定适合使用ThreadLocal,因为它们可能会用特定的方式运行线程。举个例子,一个Swing客户端可能希望所有在JVM中的线程使用Security上下文。你可以配置SecurityContextHolder使得它在启动时以你希望的方式来保存上下文数据。对于一个独立的应用你可以使用SecurityContextHolder.MODE_GLOBAL策略。其他应用可能希望由安全线程与其衍生出来的线程具有统一的安全标示,则可以使用SecurityContextHolder.MODE_INHERITABLETHREADLOCAL策略。你可以通过两种方式改变默认的SecurityContextHolder.MODE_THREADLOCAL模式。第一种是设置一个系统属性,第二种方式是调用SecurityContextHolder的一个静态方法。大多数应用不需要修改这个默认的策略,如果需要修改,看看JavaDocs中的SecurityContextHolder获取更多信息。
Obtaining information about the current user
在SecurityContextHolder中我们保存了当前与应用交互的principal数据,Spring Security使用一个Authentication对象来保存和展示这些数据。你不需要自己手工创建一个Authentication对象,而且查询这个对象也相当的简单,你可以使用下面的代码(在你的应用的任意位置)获取当前认证用户的姓名信息:
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if (principal instanceof UserDetails) { String username = ((UserDetails)principal).getUsername(); } else { String username = principal.toString(); }
getContext()方法返回的对象是SecurityContext接口的实例,这就是保存在ThreadLocal局部变量中的对象。
参考资料来自《Spring Security Reference Documentation(3.1)》,下载地址:http://download.csdn.net/detail/u010009900/9169039
相关文章推荐
- Python动态类型的学习---引用的理解
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- MySQL 安全事宜
- 土人系列AS入门教程 -- 对象篇
- C#托管堆对象实例包含内容分析
- C#线程间不能调用剪切板的解决方法
- C#实现获取不同对象中名称相同属性的方法
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- VBS教程:对象-正则表达式(RegExp)对象
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- C#编程自学之类和对象