cas-server集群部署无法实现单点登录问题

当cas-server部署到生产环境时,是三台服务器用nginx的负载均衡的集群模式,会出现其中一个项目登录成功后,访问另一个项目有时候还需要登录,是因为cas-server的tgt是存在tomcat的内存中,两个项目可能会访问到不同的服务器,所以要实现共享ticket。这里使用的是redis

修改/WEB-INF/spring-configuration/ticketRegistry.xml

<bean id="ticketRegistry" class="com.sys.action.RedisTicketRegistry" />

cas-server提供了一个集群的抽象类,AbstractDistributedTicketRegistry,我们需要实现里面的方法。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collection;

import org.apache.log4j.Logger;
import org.jasig.cas.ticket.ServiceTicketImpl;
import org.jasig.cas.ticket.Ticket;
import org.jasig.cas.ticket.TicketGrantingTicket;
import org.jasig.cas.ticket.TicketGrantingTicketImpl;
import org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry;


import com.genilex.utils.PropertiesUtil;
import com.genilex.utils.RedisCache;

public class RedisTicketRegistry extends AbstractDistributedTicketRegistry {
    private static final Logger log = Logger.getLogger(RedisTicketRegistry.class);
    
    //ST最大空闲时间 
    private static int st_time = PropertiesUtil.getPropertyInt("st_time");  
    //TGT最大空闲时间 
    private static int tgt_time = PropertiesUtil.getPropertyInt("tgt_time");
    
    @Override
    protected boolean needsCallback() {
        return false;
    }

    @Override
    protected void updateTicket(final Ticket ticket) {
        System.out.println("updateTicket---tikcet:"+ticket);
        addTicket(ticket); 
    }

    @Override
    public void addTicket(final Ticket ticket) {
        System.out.println("addTicket---ticket:"+ticket);
        int seconds = 0; 
        String key = ticket.getId() ; 
        
        if(ticket instanceof TicketGrantingTicket){ 
            seconds = tgt_time; 
        }else{ 
            seconds = st_time; 
        } 
        
        ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
        ObjectOutputStream oos = null; 
        try{ 
            oos = new ObjectOutputStream(bos); 
            oos.writeObject(ticket); 
              
        }catch(Exception e){ 
            log.error("adding ticket to redis error."); 
        }finally{ 
            try{  
                if(null!=oos) 
                    oos.close(); 
            }catch(Exception e){ 
                log.error("oos closing error when adding ticket to redis."); 
            } 
        } 
        
        RedisCache.set(key.getBytes(), bos.toByteArray(), seconds);
    }

    @Override
    public boolean deleteTicket(final String ticketId) {
        System.out.println("deleteTicket---ticketId:"+ticketId);
        if (ticketId == null) {
            return false;
        }
        RedisCache.del(ticketId.getBytes());
        return true;
    }

    @Override
    public Ticket getTicket(final String ticketId) {
        System.out.println("getTicket---ticketId:"+ticketId);
        if(null == ticketId) {
            return null; 
        }
        byte[] ticketByte = RedisCache.get(ticketId.getBytes());
        if(ticketByte == null) {
            return null;
        }
        
        Ticket ticket = null; 
        ByteArrayInputStream bais = new ByteArrayInputStream(ticketByte); 
        ObjectInputStream ois = null; 
               
        try{ 
            ois = new ObjectInputStream(bais); 
            ticket = (Ticket)ois.readObject();  
        }catch(Exception e){ 
            log.error("getting ticket to redis error."); 
        }finally{ 
            try{ 
                if(null!=ois)  ois.close(); 
            }catch(Exception e){ 
                log.error("ois closing error when getting ticket to redis."); 
            } 
        } 
        return getProxiedTicketInstance(ticket); 
    }
    
    /**
     * 取得当前用户名
     * @param ticket
     * @return
     */
    private String getUsername(Ticket ticket){
         TicketGrantingTicket t = null;  
         try {  
             t = (TicketGrantingTicketImpl)ticket;  
         }catch (Exception e){  
             t = ((ServiceTicketImpl)ticket).getGrantingTicket();  
         }  
         return t.getAuthentication().getPrincipal().getId();
    }

    @Override
    public Collection<Ticket> getTickets() {
        throw new UnsupportedOperationException("GetTickets not supported."); 
    }

 

转载于:https://www.cnblogs.com/jason123/p/8618331.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值