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

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 Boot Oauth2缓存UserDetails到Ehcache

    通过这种方式,当OAuth2客户端请求访问令牌时,Spring Security会首先查找缓存中的UserDetails,如果找不到,则调用`CustomUserDetailsService`从数据库中加载UserDetails,并将其存入Ehcache。这样,后续的请求就...

    初识 Spring Security - v1.1.pdf

    ### 初识 Spring Security #### 一、Spring Security 概述 **Spring Security**是一种广泛应用于Java企业级项目中的安全框架,它基于Spring AOP(面向切面编程)和Servlet过滤器来提供全面的安全解决方案。该框架...

    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 ...

    spring security国际化及UserCache的配置和使用

    &lt;bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache"&gt; &lt;bean id="userEhCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt; ...

    Spring Security Oauth2.docx

    `UserJwt` 实现了`UserDetails`接口,是Spring Security进行用户验证时使用的用户对象。 `changgou.jks` 是一个密钥库文件,通常用于存放公钥和私钥。配置文件`application.yml`包含了认证服务的配置,如令牌的超时...

    spring-Acgei的一个小例子之二

    ### Spring与Acegi Security结合应用:用户验证及缓存机制 #### 一、Spring与Acegi Security概述 在本文档中,我们将深入了解如何利用Spring框架的IoC(Inverse of Control,控制反转)容器来实现Acegi Security的...

    Spring Boot项目学习15之我的主页和用户中心模块

    首先,我们需要了解Spring Security,它是Spring Boot默认集成的安全框架。它提供了全面的身份验证和授权服务,使我们能够轻松地保护应用程序的资源。在创建“我的主页”时,我们需要确保只有已登录的用户才能访问。...

    spring-ldap-1.3.1.RELEASE-with-dependencies.zip

    &lt;bean class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator"&gt; ,dc=example,dc=com"/&gt; (member={0})"/&gt; ``` 在这个配置中,我们指定了LDAP服务器的URL、基础DN、管理...

    loginspring:使用spring登录系统

    - 如果认证成功,Spring Security会创建一个Security Context,其中包含认证的Principal(通常是UserDetails对象)。 2. **授权过程**: - 认证成功后,Spring Security会检查每个后续请求,查看用户是否有访问该...

    基于Dubbo实现的SOA分布式(没有实现分布式事务)-SpringBoot整合各种组件的JavaWeb脚手架+源代码+文档

    - Spring Security - JavaMail - Thymeleaf - HttpClient - FileUpload - Spring Scheduler - Hibernate Validator - Redis Cluster - MySQL主从复制,读写分离 - Spring Async - Spring Cache - Swagger - Spring ...

    基于springmvc框架,搭建

    在实际项目中,我们还需要考虑异常处理、安全控制(如Spring Security)、缓存管理(如Spring Cache)等方面。这些都可以通过SpringMVC提供的扩展点进行配置和实现。 总结起来,SpringMVC框架提供了强大的MVC架构...

    传统java项目的构建思路以及相关技术使用

    本文总结了传统Java项目的构建思路和相关技术使用,涵盖文件分片上传、Jplag返回的数据类型、Spring Security、基础服务、Docker、线程池、同步互斥信号量、业务流程优化、SQL优化、MongoDB分片集群存储等多方面的...

    ssm小项目京东轮播效果案例等

    1. **配置Spring Security**:在`web.xml`或Spring配置文件中配置Spring Security拦截器。 2. **定义用户详情服务**:实现`UserDetailsService`接口,用于加载用户的认证信息。 3. **编写控制器方法**:处理用户登录...

    restfulapi:restfulapi实践

    在Spring Boot中,可以使用Spring Security配合Spring Cloud Security来实现OAuth2或JWT。例如,对于JWT,我们可以创建一个TokenProvider,负责生成和验证令牌,并在过滤器中检查每个请求的Authorization头: ```...

Global site tag (gtag.js) - Google Analytics