cas 入门之十五:ticket 存储方案-jpa ticket存储

本文档介绍了如何在CAS中使用JPA作为Ticket的存储方案,通过配置PersistenceAnnotationBeanPostProcessor和LocalContainerEntityManagerFactoryBean来实现。
        jpa ticket存储,也就是可以让cas将ticket存储在后端的数据库,比如oracle,mysql等。这个功能可以让我们来构建高可用的cas 服务器集群。下面我会描述具体的配置,让cas如何将ticket存入后端oracle数据库,在实际生产应用中我也是存入oracle数据库的。其实存在哪个数据库都一样,相互转换很容易,只需要更改一下数据源及数据库驱动就可以了。cas/webapp/WEB-INF/spring-configuration/ticketRegistry.xml 找到这个文件,对于jpa ticket的配置,只需要更改这个文件。(对于cas spring配置文件,可参看 cas入门之二spring配置文件
步骤:
1.更换默认ticket存储器
  <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" />
   替换为
   <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.JpaTicketRegistry" />
   并在ticketRegistry.xml文件中加入如下bean配置:
   <!--  让@PersistenceUnit and @PersistenceContext 自动注入 EntityManager/Factory 实例 -->

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

<property name="dataSource" ref="dataSource"/>
   <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
         <property name="generate
### 基于票据的登录机制(Ticket-based 登录机制)的工作原理 Ticket-based 登录机制是一种常见的认证方式,广泛应用于单点登录(SSO)系统中,例如 CAS(Central Authentication Service)。其核心思想是通过一个临时且唯一的票据(Ticket)来标识用户身份,实现跨系统的认证和授权。 在 Ticket-based 登录机制中,整个流程通常包括以下几个关键步骤: 1. **用户发起请求**:用户尝试访问受保护的应用系统(称为服务端),但尚未登录。 2. **重定向到认证中心**:服务端检测到用户未认证,将其重定向至认证中心(如 CAS Server)进行身份验证。 3. **用户身份验证**:用户在认证中心输入用户名和密码完成登录操作。如果认证成功,认证中心会生成一个唯一的票据(Service Ticket),并将其返回给用户的浏览器。 4. **票据验证**:浏览器携带该票据再次访问原始服务端,服务端将票据发送至认证中心进行验证。 5. **获取用户信息并建立会话**:认证中心确认票据有效后,服务端可以获取用户信息,并为用户创建本地会话,从而完成登录过程 [^1]。 ### TicketGrantingTicket 与 ServiceTicket 的关系 在 CAS 实现中,`TicketGrantingTicket`(TGT)表示用户已经通过认证的状态,它与用户的会话相关联。当用户请求访问某个服务时,CAS 会基于 TGT 生成一个 `ServiceTicket`(ST),用于特定服务的验证 [^1]。 `TicketGrantingTicketImpl` 类中的 `grantServiceTicket` 方法负责生成 ServiceTicket,并通过 `this.services.put(id, service)` 将其存储在内存或持久化存储中,以便后续验证使用 [^1]。 ### Ticket存储与高可用性 为了支持分布式环境下的高可用性和可扩展性,Ticket 数据需要被安全地存储和共享。CAS 提供了多种 Ticket 存储实现,包括: - **BerkleyDBTicketRegistry**:基于 Berkeley DB 的高性能嵌入式数据库。 - **EhcacheTicketRegistry**:使用 Ehcache 缓存框架实现内存级缓存。 - **JDBCTicketRegistry**:将 Ticket 数据存储在关系型数据库中。 - **MemcacheTicketRegistry**:利用 Memcached 分布式缓存系统实现高效的 Ticket 存储- **JpaTicketRegistry**:基于 JPA 标准实现持久化存储 [^2]。 这些实现确保了 Ticket 数据能够在多节点环境中保持一致性,并提供容错能力,避免因单点故障导致服务中断。 ### Ticket-based 登录机制的实现方式 #### 1. 使用 CAS 实现 Ticket-based 登录 CAS 是一种成熟的开源 SSO 解决方案,支持完整的 Ticket-based 登录机制。以下是一个简单的 CAS 客户端集成示例: ```java // 在客户端应用中配置 CAS 过滤器 <filter> <filter-name>CAS Authentication Filter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <value>https://cas.example.com/cas/login</value> </init-param> <init-param> <param-name>serverName</param-name> <value>http://client-app.example.com</value> </init-param> </filter> <filter-mapping> <filter-name>CAS Authentication Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` #### 2. 自定义 Ticket 验证逻辑 如果需要自定义 Ticket 验证逻辑,可以通过调用 CAS 提供的 `/serviceValidate` 接口验证 ServiceTicket: ```python import requests def validate_ticket(cas_url, service, ticket): validation_url = f"{cas_url}/serviceValidate?service={service}&ticket={ticket}" response = requests.get(validation_url) return response.text # 返回 XML 或 JSON 格式的验证结果 ``` #### 3. Ticket 生命周期管理 Ticket 的生命周期通常由认证中心管理,包括生成、验证和销毁。在 CAS 中,可以通过配置 `ticket.expirationPolicy` 设置 Ticket 的过期时间,例如: ```yaml # application.properties cas.ticket.st.timeToKillInSeconds=10 cas.ticket.tgt.maxTimeToLiveInSeconds=7200 ``` 上述配置分别设置了 ServiceTicketTicketGrantingTicket 的最大存活时间。 ###
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值