CAS与spring-boot集成


发布于 2022-06-11 / 48 阅读 / 0 评论 /
spring-boot框架中,如何使用cas作为统一登录方案?

在应用程序开发中,我们的应用程序是以cas-client角色加入到统一认证体系中来的,需要添加以下依赖。

<dependency>
  <groupId>org.jasig.cas.client</groupId>
  <artifactId>cas-client-core</artifactId>
</dependency>

1.spring-session管理cas session

cas-client的session由spring-session进行管理,需要加入以下依赖:

<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-core</artifactId>
</dependency>

Spring session的配置在spring-boot-autoconfigure模块的org.springframework.boot.autoconfigure.session.SessionProperties类中,以“spring.session”,主要是定义session共享的策略,比如通过redis进行共享。

2.redis对session进行管理

如果Session在redis中进行共享,则需把spring.session.store-type配置为redis,同时在应用程序中添加以下依赖:

<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
</dependency>

spring-session-data-redis依赖的加入已经带入了spring-session-core依赖,所以spring-session-core无需显式添加依赖。

redis的配置在spring-boot-autoconfigure模块的org.springframework.boot.autoconfigure.data.redis.RedisProperties类中。

redis client的配置在org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration或org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration,表示支持两种不同的客户端。

org.springframework.session.web.http.SessionRepositoryFilter的doFilterInternal方法中,最后会通过sessionRepository进来保存session。而sessionRepository正是org.springframework.session.data.redis.RedisSessionRepository类的实例。

3.Redis中session数据乱码问题

在初始化RedisTemplate时,会设置对应的serializer,这个决定了保存在redis中key和value的序列化格式,默认是使用ISO_8859_1编码的,所以直接在redis中查看的话,会出现乱码。

原因主要是:spring-data-redis 的 RedisTemplate<K, V>模板类 在操作redis时默认使用JdkSerializationRedisSerializer 来进行序列化。spring操作redis是在jedis客户端基础上进行的,而jedis客户端与redis交互的时候协议中定义是用byte类型交互,看到spring-data-redis中RedisTemplate<K, V>在操作的时候k,v是泛型对象,而不是byte[]类型的,这样导致的一个问题就是,如果不对RedisTemplate进行设置,spring会默认采用defaultSerializer = new JdkSerializationRedisSerializer();这个方法来对key、value进行序列化操作,JdkSerializationRedisSerializer它使用的编码是ISO-8859-1。

如果要看到明文的session数据,解决方案有多种:

(1)使用 StringRedisTemplate 而不是使用 RedisTemplate;

(2)使用RedisTemplate,则需要设置对应的序列化器为StringRedisSerializer;

(3)使用RedisTemplate是,规定范型为<String, String>。

这样,就可以看到可打印字符了。