cas 入门之十五:ticket 存储方案-jpa ticket存储
来源:互联网 发布:xrd分析软件下载 编辑:程序博客网 时间:2024/04/30 04:43
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 实例 -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true"/>
<property name="showSql" value="true" />
</bean>
</property>
<property name="jpaProperties">
<props>
<!-- 数据库驱动 -->
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory" />
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 数据源配置略-->
<bean id="dataSource" />
<bean id="cleanerLock"
class="org.jasig.cas.ticket.registry.support.JpaLockingStrategy"
p:uniqueId="${host.name}"
p:applicationId="cas-ticket-registry-cleaner" />
这里主要说一下cleanerLock,它会在数据库是产生locks表:
Name Type Nullable Default Comments
--------------- ------------- -------- ------- --------
APPLICATION_ID VARCHAR2(255)
EXPIRATION_DATE DATE Y
UNIQUE_ID VARCHAR2(255) Y
在集群环境,多个cas 服务器共享同一个数据库节点,当需要清理ticket时,会出现表争用,但是cas通过cleanerLock解决了这个问题,同时并不会影响应用的性能。
2.ticket清理
<bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"
p:ticketRegistry-ref="ticketRegistry" />
更改为
<bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"
p:ticketRegistry-ref="ticketRegistry"
p:lock-ref="cleanerLock" />
其余的不变。
3.增加相应的jar
主要的jar:
hibernate-core
hibernate-entitymanager
hibernate-jpa-2.0-api
hibernate-commons-annotations
hibernate-validator
另外还有相应数据库的jar,在此不列举。到此关于jpa ticket配置更改完毕。
jpa ticket配置更改完成,重新部署cas,会在相应的数据库,生成5张表:
LOCKS
RegisteredServiceImpl
SERVICETICKET
TICKETGRANTINGTICKET
rs_attributes
如果不能生成,这5张表在oracle的建表sql:
create table LOCKS
(
APPLICATION_ID VARCHAR2(255) not null,
EXPIRATION_DATE DATE,
UNIQUE_ID VARCHAR2(255)
)
;
alter table LOCKS
add primary key (APPLICATION_ID);
create table RS_ATTRIBUTES
(
REGISTEREDSERVICEIMPL_ID NUMBER(19) not null,
A_NAME VARCHAR2(255) not null,
A_ID NUMBER(10) not null
)
;
alter table RS_ATTRIBUTES
add primary key (REGISTEREDSERVICEIMPL_ID, A_ID);
create table RegisteredServiceImpl
(expression_type VARCHAR2(15) DEFAULT 'ant' not null,
id number(19,0) not null,
allowedToProxy char(1) not null,
anonymousAccess char(1) not null,
description varchar2(255),
enabled char(1) not null,
evaluation_order number(10,0) not null,
ignoreAttributes char(1) not null,
name varchar2(255),
serviceId varchar2(255),
ssoEnabled char(1) not null,
theme varchar2(255),
username_attr varchar2(256),
primary key (id)
);
create table SERVICETICKET (
ID varchar2(255) not null,
NUMBER_OF_TIMES_USED number(10,0),
CREATION_TIME number(19,0),
EXPIRATION_POLICY blob not null,
LAST_TIME_USED number(19,0),
PREVIOUS_LAST_TIME_USED number(19,0),
FROM_NEW_LOGIN char(1) not null,
TICKET_ALREADY_GRANTED char(1) not null,
SERVICE blob not null,
ticketGrantingTicket_ID varchar2(255),
primary key (ID))
;
create table TICKETGRANTINGTICKET (
ID varchar2(255) not null,
NUMBER_OF_TIMES_USED number(10,0),
CREATION_TIME number(19,0),
EXPIRATION_POLICY blob not null,
LAST_TIME_USED number(19,0),
PREVIOUS_LAST_TIME_USED number(19,0),
AUTHENTICATION blob not null,
EXPIRED char(1) not null,
SERVICES_GRANTED_ACCESS_TO blob not null,
ticketGrantingTicket_ID varchar2(255), primary key (ID));
alter table SERVICETICKET add constraint FK7645ADE132A2C0E5 foreign key (ticketGrantingTicket_ID)
references TICKETGRANTINGTICKET;
alter table TICKETGRANTINGTICKET add constraint FKB4C4CDDE32A2C0E5 foreign key (ticketGrantingTicket_ID)
references TICKETGRANTINGTICKET;
alter table rs_attributes add constraint FK4322E153C595E1F foreign key (RegisteredServiceImpl_id)
references RegisteredServiceImpl;
--下面两个索引是为了提高应用性能
CREATE INDEX ST_TGT_FK_I
ON SERVICETICKET (TICKETGRANTINGTICKET_ID)
COMPUTE STATISTICS;
CREATE INDEX TGT_TGT_FK_I
ON TICKETGRANTINGTICKET (TICKETGRANTINGTICKET_ID)
COMPUTE STATISTICS;
步骤:
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="generateDdl" value="true"/>
<property name="showSql" value="true" />
</bean>
</property>
<property name="jpaProperties">
<props>
<!-- 数据库驱动 -->
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory" />
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 数据源配置略-->
<bean id="dataSource" />
<bean id="cleanerLock"
class="org.jasig.cas.ticket.registry.support.JpaLockingStrategy"
p:uniqueId="${host.name}"
p:applicationId="cas-ticket-registry-cleaner" />
这里主要说一下cleanerLock,它会在数据库是产生locks表:
Name Type Nullable Default Comments
--------------- ------------- -------- ------- --------
APPLICATION_ID VARCHAR2(255)
EXPIRATION_DATE DATE Y
UNIQUE_ID VARCHAR2(255) Y
在集群环境,多个cas 服务器共享同一个数据库节点,当需要清理ticket时,会出现表争用,但是cas通过cleanerLock解决了这个问题,同时并不会影响应用的性能。
2.ticket清理
<bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"
p:ticketRegistry-ref="ticketRegistry" />
更改为
<bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"
p:ticketRegistry-ref="ticketRegistry"
p:lock-ref="cleanerLock" />
其余的不变。
3.增加相应的jar
主要的jar:
hibernate-core
hibernate-entitymanager
hibernate-jpa-2.0-api
hibernate-commons-annotations
hibernate-validator
另外还有相应数据库的jar,在此不列举。到此关于jpa ticket配置更改完毕。
jpa ticket配置更改完成,重新部署cas,会在相应的数据库,生成5张表:
LOCKS
RegisteredServiceImpl
SERVICETICKET
TICKETGRANTINGTICKET
rs_attributes
如果不能生成,这5张表在oracle的建表sql:
create table LOCKS
(
APPLICATION_ID VARCHAR2(255) not null,
EXPIRATION_DATE DATE,
UNIQUE_ID VARCHAR2(255)
)
;
alter table LOCKS
add primary key (APPLICATION_ID);
create table RS_ATTRIBUTES
(
REGISTEREDSERVICEIMPL_ID NUMBER(19) not null,
A_NAME VARCHAR2(255) not null,
A_ID NUMBER(10) not null
)
;
alter table RS_ATTRIBUTES
add primary key (REGISTEREDSERVICEIMPL_ID, A_ID);
create table RegisteredServiceImpl
(expression_type VARCHAR2(15) DEFAULT 'ant' not null,
id number(19,0) not null,
allowedToProxy char(1) not null,
anonymousAccess char(1) not null,
description varchar2(255),
enabled char(1) not null,
evaluation_order number(10,0) not null,
ignoreAttributes char(1) not null,
name varchar2(255),
serviceId varchar2(255),
ssoEnabled char(1) not null,
theme varchar2(255),
username_attr varchar2(256),
primary key (id)
);
create table SERVICETICKET (
ID varchar2(255) not null,
NUMBER_OF_TIMES_USED number(10,0),
CREATION_TIME number(19,0),
EXPIRATION_POLICY blob not null,
LAST_TIME_USED number(19,0),
PREVIOUS_LAST_TIME_USED number(19,0),
FROM_NEW_LOGIN char(1) not null,
TICKET_ALREADY_GRANTED char(1) not null,
SERVICE blob not null,
ticketGrantingTicket_ID varchar2(255),
primary key (ID))
;
create table TICKETGRANTINGTICKET (
ID varchar2(255) not null,
NUMBER_OF_TIMES_USED number(10,0),
CREATION_TIME number(19,0),
EXPIRATION_POLICY blob not null,
LAST_TIME_USED number(19,0),
PREVIOUS_LAST_TIME_USED number(19,0),
AUTHENTICATION blob not null,
EXPIRED char(1) not null,
SERVICES_GRANTED_ACCESS_TO blob not null,
ticketGrantingTicket_ID varchar2(255), primary key (ID));
alter table SERVICETICKET add constraint FK7645ADE132A2C0E5 foreign key (ticketGrantingTicket_ID)
references TICKETGRANTINGTICKET;
alter table TICKETGRANTINGTICKET add constraint FKB4C4CDDE32A2C0E5 foreign key (ticketGrantingTicket_ID)
references TICKETGRANTINGTICKET;
alter table rs_attributes add constraint FK4322E153C595E1F foreign key (RegisteredServiceImpl_id)
references RegisteredServiceImpl;
--下面两个索引是为了提高应用性能
CREATE INDEX ST_TGT_FK_I
ON SERVICETICKET (TICKETGRANTINGTICKET_ID)
COMPUTE STATISTICS;
CREATE INDEX TGT_TGT_FK_I
ON TICKETGRANTINGTICKET (TICKETGRANTINGTICKET_ID)
COMPUTE STATISTICS;
1 0
- cas 入门之十五:ticket 存储方案-jpa ticket存储
- cas 入门之十七:ticket 存储方案-memcached ticket 存储
- cas 入门之十四:ticket 存储方案之ConcurrentHashMap ticket存储
- cas 入门之十六:ticket 存储方案之ehcache ticket存储
- cas 入门之十三:ticket 存储方案之简介
- cas 入门之十三:ticket 存储方案之简介
- cas的ticket jpa ticket存储事务提交失败
- cas入门之二十五:ticket清理器
- 单点登录cas常见问题(四) - ticket有哪些存储方式?
- CAS Ticket
- CAS总结之Ticket篇
- CAS总结之Ticket篇
- CAS总结之Ticket篇
- cas入门之二十四:ticket的过期策略
- 基于CAS的单点登录SSO[3]: 改造cas-overlays-template支持Redis存储Ticket
- CAS 3.5.0 ticket 持久化
- Trac使用之 — Ticket
- CAS总结之Ticket篇(转,非常详细,后文还提到一个ppt,非常易懂)
- cas 入门之十四:ticket 存储方案之ConcurrentHashMap ticket存储
- NYOJ 181 小明的难题
- 我们为什么要学习Linux
- AMF协议概念简述
- USACO/maze1
- cas 入门之十五:ticket 存储方案-jpa ticket存储
- PhotoCamera引出的一个问题
- Tiny6410 移植RT5370 USB无线网卡的方法
- cas 入门之十六:ticket 存储方案之ehcache ticket存储
- 黑马程序员_字符串理解
- 反序一个无符号整数x 不占用额外的空间 采用异或操作
- 2.读取TXT文本内容,显示至图形界面中
- linux/ubuntu下free查看内存占用大的解释
- linux kernel initiate steps