1、jar 引入
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.5.1.RELEASE</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.2</version> </dependency>
2、ticketRegistry.xml 文件修改
添加以下配置:
<bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.RedisTicketRegistry"> <constructor-arg index="0" ref="redisTemplate" /> <constructor-arg index="1" value="1800" /> <constructor-arg index="2" value="10" /> </bean> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="200" /> <property name="testOnBorrow" value="true" /> </bean> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${cas.redis.ip}"/> <property name="port" value="${cas.redis.port}"/> <property name="password" value="${cas.redis.password}"/> <property name="poolConfig" ref="jedisPoolConfig"/> </bean> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory"/> </bean>
去掉原配置:
<!--<!– Ticket Registry –> <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry"/> <!–Quartz –> <!– TICKET REGISTRY CLEANER –> <bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner" c:centralAuthenticationService-ref="centralAuthenticationService" c:ticketRegistry-ref="ticketRegistry"/> <bean id="jobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" p:targetObject-ref="ticketRegistryCleaner" p:targetMethod="clean"/> <bean id="triggerJobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean" p:jobDetail-ref="jobDetailTicketRegistryCleaner" p:startDelay="20000" p:repeatInterval="5000000"/>-->
3、cookie 管理 配置修改 ticketGrantingTicketCookieGenerator.xml。
将原来的
<bean id="cookieValueManager" class="org.jasig.cas.web.support.DefaultCasCookieValueManager" c:cipherExecutor-ref="cookieCipherExecutor"/>
修改为:
<!--liuchao 2018/06/03 session 共享使用 只获取值--> <bean id="cookieValueManager" class="org.jasig.cas.web.support.NoOpCookieValueManager"/>
4、登录流程配置修改cas-servlet.xml;
将原来的
<bean id="loginFlowCipherBean" class="org.jasig.cas.web.flow.CasWebflowCipherBean" c:cipherExecutor-ref="webflowCipherExecutor" />修改为
<bean id="loginFlowCipherBean" class="org.jasig.cas.web.flow.CasWebflowCipherBean" c:cipherExecutor-ref="noOpByteCipherExecutor" />
package org.jasig.cas.ticket.registry; /** * @author * @create 2018-06-02 14:55 **/ @Component("noOpByteCipherExecutor") public class NoOpByteCipherExecutor extends AbstractCipherExecutor<byte[], byte[]> { private static final Logger LOGGER = LoggerFactory.getLogger(NoOpByteCipherExecutor.class); /** * Instantiates a new No-Op cipher executor. * Issues a warning on safety. */ public NoOpByteCipherExecutor() { super(NoOpByteCipherExecutor.class.getName()); LOGGER.warn("[{}] does no encryption and may NOT be safe in a production environment. " + "Consider using other choices, such as [{}] that handle encryption, signing and verification of " + "all appropriate values.", this.getClass().getName(), BaseStringCipherExecutor.class.getName()); } @Override public byte[] encode(final byte[] value) { return value; } @Override public byte[] decode(final byte[] value) { return value; } }
package org.jasig.cas.ticket.registry; /** * @author * @create 2018-05-29 17:13 **/ public class RedisTicketRegistry extends AbstractDistributedTicketRegistry implements DisposableBean { /** Memcached client. */ @NotNull private final RedisTemplate<String, Object> redisTemplate; /** * TGT cache entry timeout in seconds. */ @Min(0) private final int tgtTimeout; /** * ST cache entry timeout in seconds. */ @Min(0) private final int stTimeout; public RedisTicketRegistry(RedisTemplate<String, Object> redisTemplate, int tgtTimeout, int stTimeout) { this.redisTemplate = redisTemplate; this.tgtTimeout = tgtTimeout; this.stTimeout = stTimeout; } @Override public void addTicket(Ticket ticket) { logger.debug("Adding ticket {}", ticket); try { this.redisTemplate.opsForValue().set(ticket.getId(),ticket, getTimeout(ticket), TimeUnit.SECONDS); } catch (Exception e) { logger.error("Failed adding {}", ticket, e); } } @Override public Ticket getTicket(String ticketId) { try { final Ticket t = (Ticket) this.redisTemplate.opsForValue().get(ticketId); if (t != null) { return getProxiedTicketInstance(t); } } catch (final Exception e) { logger.error("Failed fetching {} ", ticketId, e); } return null; } @Override public boolean deleteTicket(String ticketId) { if (ticketId == null) { return false; } final Ticket ticket = getTicket(ticketId); if (ticket == null) { return false; } logger.debug("Deleting ticket {}", ticketId); try { this.redisTemplate.delete(ticketId); } catch (final Exception e) { logger.error("Failed deleting {}", ticketId, e); } return false; } @Override protected void updateTicket(Ticket ticket) { logger.debug("Updating ticket {}", ticket); try { if(this.redisTemplate.hasKey(ticket.getId())) { this.redisTemplate.opsForValue().set(ticket.getId(), ticket, getTimeout(ticket), TimeUnit.SECONDS); } } catch (final Exception e) { logger.error("Failed updating {}", ticket, e); } } @Override public Collection<Ticket> getTickets() { throw new UnsupportedOperationException("GetTickets not supported."); } @Override protected boolean needsCallback() { return true; } @Override public void destroy() throws Exception { } /** * Gets the timeout value for the ticket. * * @param t the t * @return the timeout */ private int getTimeout(final Ticket t) { if (t instanceof TicketGrantingTicket) { return this.tgtTimeout; } else if (t instanceof ServiceTicket) { return this.stTimeout; } throw new IllegalArgumentException("Invalid ticket type"); } }
package org.jasig.cas.ticket.registry; /** * @author * @create 2018-05-30 13:53 **/ public class TicketRedisTemplate extends RedisTemplate<String, Ticket> { public TicketRedisTemplate() { RedisSerializer<String> string = new StringRedisSerializer(); JdkSerializationRedisSerializer jdk = new JdkSerializationRedisSerializer(); setKeySerializer(string); setValueSerializer(jdk); setHashKeySerializer(string); setHashValueSerializer(jdk); } public TicketRedisTemplate(RedisConnectionFactory connectionFactory) { this(); setConnectionFactory(connectionFactory); afterPropertiesSet(); } }