您的位置:首页 > 移动开发 > Objective-C

SecurityContextHolder, SecurityContext and Authentication Objects

2015-10-12 21:31 639 查看

[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息