`
234390216
  • 浏览: 10192056 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460734
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771658
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395324
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393854
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678180
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529236
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178634
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461646
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150077
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66795
社区版块
存档分类
最新评论

Spring Security(07)——缓存UserDetails

阅读更多

       Spring Security提供了一个实现了可以缓存UserDetailsUserDetailsService实现类,CachingUserDetailsService。该类的构造接收一个用于真正加载UserDetailsUserDetailsService实现类。当需要加载UserDetails时,其首先会从缓存中获取,如果缓存中没有对应的UserDetails存在,则使用持有的UserDetailsService实现类进行加载,然后将加载后的结果存放在缓存中。UserDetails与缓存的交互是通过UserCache接口来实现的。CachingUserDetailsService默认拥有UserCache的一个空实现引用,NullUserCache。以下是CachingUserDetailsService的类定义。

public class CachingUserDetailsService implements UserDetailsService {

    private UserCache userCache = new NullUserCache();

    private final UserDetailsService delegate;

 

    CachingUserDetailsService(UserDetailsService delegate) {

        this.delegate = delegate;

    }

 

    public UserCache getUserCache() {

        return userCache;

    }

 

    public void setUserCache(UserCache userCache) {

        this.userCache = userCache;

    }

 

    public UserDetails loadUserByUsername(String username) {

        UserDetails user = userCache.getUserFromCache(username);

 

        if (user == null) {

            user = delegate.loadUserByUsername(username);

        }

 

        Assert.notNull(user, "UserDetailsService " + delegate + " returned null for username " + username + ". " +

                "This is an interface contract violation");

 

        userCache.putUserInCache(user);

 

        return user;

    }

}

       我们可以看到当缓存中不存在对应的UserDetails时将使用引用的UserDetailsService类型的delegate进行加载。加载后再把它存放到Cache中并进行返回。除了NullUserCache之外,Spring Security还为我们提供了一个基于EhcacheUserCache实现类,EhCacheBasedUserCache,其源码如下所示。

public class EhCacheBasedUserCache implements UserCache, InitializingBean {

 

    private static final Log logger = LogFactory.getLog(EhCacheBasedUserCache.class);

 

    private Ehcache cache;

 

    public void afterPropertiesSet() throws Exception {

        Assert.notNull(cache, "cache mandatory");

    }

 

    public Ehcache getCache() {

        returncache;

    }

 

    public UserDetails getUserFromCache(String username) {

        Element element = cache.get(username);

        if (logger.isDebugEnabled()) {

            logger.debug("Cache hit: " + (element != null) + "; username: " + username);

        }

        if (element == null) {

            returnnull;

        } else {

            return (UserDetails) element.getValue();

        }

    }

 

    public void putUserInCache(UserDetails user) {

        Element element = new Element(user.getUsername(), user);

        if (logger.isDebugEnabled()) {

            logger.debug("Cache put: " + element.getKey());

        }

        cache.put(element);

    }

 

    public void removeUserFromCache(UserDetails user) {

        if (logger.isDebugEnabled()) {

            logger.debug("Cache remove: " + user.getUsername());

        }

        this.removeUserFromCache(user.getUsername());

    }

 

    public void removeUserFromCache(String username) {

        cache.remove(username);

    }

 

    public void setCache(Ehcache cache) {

        this.cache = cache;

    }

}

 

       从上述源码我们可以看到EhCacheBasedUserCache所引用的Ehcache是空的,所以,当我们需要对UserDetails进行缓存时,我们只需要定义一个Ehcache实例,然后把它注入给EhCacheBasedUserCache就可以了。接下来我们来看一下定义一个支持缓存UserDetailsCachingUserDetailsService的示例。

   <security:authentication-manager alias="authenticationManager">

      <!-- 使用可以缓存UserDetailsCachingUserDetailsService -->

      <security:authentication-provider

         user-service-ref="cachingUserDetailsService" />

   </security:authentication-manager>

   <!-- 可以缓存UserDetailsUserDetailsService -->

   <bean id="cachingUserDetailsService" class="org.springframework.security.config.authentication.CachingUserDetailsService">

      <!-- 真正加载UserDetailsUserDetailsService -->

      <constructor-arg ref="userDetailsService"/>

      <!-- 缓存UserDetailsUserCache -->

      <property name="userCache">

         <bean class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">

            <!-- 用于真正缓存的Ehcache对象 -->

            <property name="cache" ref="ehcache4UserDetails"/>

         </bean>

      </property>

   </bean>

   <!-- 将使用默认的CacheManager创建一个名为ehcache4UserDetailsEhcache对象 -->

   <bean id="ehcache4UserDetails" class="org.springframework.cache.ehcache.EhCacheFactoryBean"/>

   <!-- 从数据库加载UserDetailsUserDetailsService -->

   <bean id="userDetailsService"

      class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">

      <property name="dataSource" ref="dataSource" />

   </bean>

 

       在上面的配置中,我们通过EhcacheFactoryBean定义的Ehcache bean对象采用的是默认配置,其将使用默认的CacheManager,即直接通过CacheManager.getInstance()获取当前已经存在的CacheManager对象,如不存在则使用默认配置自动创建一个,当然这可以通过cacheManager属性指定我们需要使用的CacheManagerCacheManager可以通过EhCacheManagerFactoryBean进行定义。此外,如果没有指定对应缓存的名称,默认将使用beanName,在上述配置中即为ehcache4UserDetails,可以通过cacheName属性进行指定。此外,缓存的配置信息也都是使用的默认的。更多关于Spring使用Ehcache的信息可以参考我的另一篇文章《Spring使用Cache》。

 

(注:本文是基于Spring Security3.1.6所写)

 

 (注:原创文章,转载请注明出处。原文地址:http://elim.iteye.com/blog/2159871

5
0
分享到:
评论

相关推荐

    Spring Security UserDetails实现原理详解

    主要介绍了Spring Security UserDetails实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    详解Spring Boot Oauth2缓存UserDetails到Ehcache

    主要介绍了详解Spring Boot Oauth2缓存UserDetails到Ehcache,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Spring Security 文档

    前者是将配置文件或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security使用,后者提取用户名和权限组成一个完整的(UserDetails)User对象,该对象可以提供用户的详细信息供AuthentationManager...

    spring security 参考手册中文版

    Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...

    SpringSecurity 3.0.1.RELEASE.CHM

    1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. Config -...

    Spring Security-3.0.1中文官方文档(翻译版)

    Spring Security-3.0.1 中文官方文档(翻译版) 这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...

    Spring Security3的使用

    前者是将配置文件或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security使用,后者提取用户名和权限组成一个完整的 (UserDetails)User对象,该对象可以提供用户的详细信息供AuthentationManager...

    Spring Security 中文教程.pdf

    1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. ...

    spring-webflux-security-jwt:使用Spring Reactive Webflux,Spring Boot 2和Spring Security 5的JWT授权和认证实现

    使用JWT与Spring WebFlux和Spring Security Reactive进行身份验证和授权首先阅读的好文档在开始之前,我建议您先阅读下一份参考启用S​​pring WebFlux安全性在你的应用程序首先使Webflux安全@EnableWebFluxSecurity...

    springboot-jpa-security:Spring Data JPA和Spring Security配置示例项目

    用户:实现Spring Security的UserDetails界面 Authority:一种实现Spring Security的GrantedAuthority接口的枚举类型。 应用程序的用户权限更有可能在应用程序设计阶段定义。 如果您想将权限作为实体来管理...(我...

    spring-boot-security-saml-sample:SBS3 —基于Spring Boot构建的示例SAML 2.0服务提供程序

    特别是,它展示了如何通过集成Spring Boot和Spring Security SAML开发为联合身份验证设计的Web解决方案。 使用Java注释(无XML)已完全定义了配置。 SSOCircle ( )用作测试的公共身份提供者。 作者: Vincenzo De...

    spring-security-joomla:Joomla + Spring Security 授权集成

    Spring Security Joomla 提供程序概述该项目提供了允许 Spring Security 使用 Joomla 用户帐户的实现。 主要思想是为Joomla 起主要作用且需要集成Spring/Java 应用程序的环境提供解决方案。它是如何完成的? Joomla ...

    ss3-7:ss3-*一共12个demo, 每个demo介绍springsecurity的部分功能, 对springsecurity进行迭代展示

    ss3-*一共12个demo, 每个demo介绍springsecurity的部分功能, 对springsecurity进行迭代展示. ss3-7 ss3-1 ~ ss3-6使用基于session的方式进行认证, 从ss3-7开始将构建restful的无状态带凭证认证. ss3-6 该项目在ss3-5...

    spring-security-jdbcuserdetails-sample

    入门概述该项目显示了一个使用Spring内置JdbcUserDetailsManager来管理用户的最小示例。 该示例提供了一个AccountController,可用于从具有ADMIN角色的帐户添加用户。 在启动时,该应用程序将生成带有随机密码的...

    Spring系统的安全管理

    Spring Security的验证过程:  Spring Security完成验证工作的主要类是AuthenticationManager,即上面介绍的过滤器。这个过程从AuthenticationProcessingFilter拦截HTTP请求开始,接着,会从HTTP请求中得到用户输入...

    2spring security+jpa外键关联学习笔记1

    其实不管基于内存的操作还是基于数据库的操作,security的目的都是只有一个,拿到当前的User以及相关的UserDetails信息,在基于内存的时候,用户名

    详解Spring Security进阶身份认证之UserDetailsService(附源码)-附件资源

    详解Spring Security进阶身份认证之UserDetailsService(附源码)-附件资源

    spring-security

    Spring Security核心类解析架构概览图SecurityContextHolderSecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保存在...

    spring-security:授权+资源服务器

    Spring安全授权+资源服务器。 使用oauth2实现了简单的授权+资源服务器。授权服务器: 为用户,角色,客户端定义实体,存储库,服务。 将数据存储在内存H2数据库中。 定义UserDetails,UserDetailsS​​ervice,...

Global site tag (gtag.js) - Google Analytics