美文网首页
2018-07-11

2018-07-11

作者: wencai | 来源:发表于2018-07-23 14:26 被阅读0次

SecurityContextHolder:
简述:用来存储应用程序安全上下文详细信息。
其中最重要的方法就是initialize(),默认使用的存储策略是MODE_THREADLOCAL,当然也可指定其他方式。见源码:

private static void initialize() {
        if (!StringUtils.hasText(strategyName)) {
            strategyName = "MODE_THREADLOCAL";
        }

        if (strategyName.equals("MODE_THREADLOCAL")) {
            strategy = new ThreadLocalSecurityContextHolderStrategy();
        } else if (strategyName.equals("MODE_INHERITABLETHREADLOCAL")) {
            strategy = new InheritableThreadLocalSecurityContextHolderStrategy();
        } else if (strategyName.equals("MODE_GLOBAL")) {
            strategy = new GlobalSecurityContextHolderStrategy();
        } else {
            try {
                Class<?> clazz = Class.forName(strategyName);
                Constructor<?> customStrategy = clazz.getConstructor();
                strategy = (SecurityContextHolderStrategy)customStrategy.newInstance();
            } catch (Exception var2) {
                ReflectionUtils.handleReflectionException(var2);
            }
        }

        ++initializeCount;
    }

如何修改其存储策略呢,从源码一窥究竟:

private static String strategyName = System.getProperty("spring.security.strategy");
public static void setStrategyName(String strategyName) {
        strategyName = strategyName;
        initialize();
    }

至于可修改的存储策略有哪些呢?从第一段源码中可知,支持系统已有的(MODE_THREADLOCAL、MODE_INHERITABLETHREADLOCAL、MODE_GLOBAL)和自定义两种方式。大多数应用使用默认的存储策略。如何修改其存储策略呢?从第一段源码可看出有两种方式:①直接指定spring.security.strategy属性;②就是调用setStrategyName()。

如何获取当前用户的信息:
SecurityContextHolder用Authentication来存储详细的主体信息。可通过以下代码在任何地方获取通过验证的用户名称:

Object principal = SecurityContextHolder.getContext()。getAuthentication()。getPrincipal();

if(principal instanceof UserDetails){
String username =((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}

SecurityContextHolderStrategy:
简述:针对线程,存储安全上下文信息的策略
SecurityContext:
简述:安全上下文,与当前线程关联的最小安全消息。
Authentication:
简述:表示一次认证请求的token,或者一个经过认证的主体(principal)。
如何认证?交由AuthenticationManager的authenticate()处理。
一旦经过认证,Authentication会存储在一个thread-local的SecurityContext中。
属性authenticated:除非将此属性设为true,否则它在遇到任何安全拦截器仍将需要经过认证

相关文章

网友评论

      本文标题:2018-07-11

      本文链接:https://www.haomeiwen.com/subject/mtzcpftx.html