SecurityContextHolder, SecurityContext and Authentication Objects

SecurityContextHolder, SecurityContext and Authentication Objects

    最重要并且最根本的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值