Apereo CAS 6.x: 嵌入式 HSQLDB 未初始化
Apereo CAS 6.x: embeded HSQLDB not initialized
我想在 CAS 6.2-RC5 中使用嵌入式 HSQLDB,我希望 Spring 在启动时对其进行初始化。
首先,我在 cas-overlay-template 中添加了以下依赖项:
implementation "org.apereo.cas:cas-server-support-json-service-registry:${casServerVersion}"
implementation "org.apereo.cas:cas-server-support-ldap:${casServerVersion}"
implementation "org.apereo.cas:cas-server-support-session-jdbc:${casServerVersion}"
#implementation "org.apereo.cas:cas-server-support-jpa-ticket-registry:${casServerVersion}"
其次,我在application.yml中使用了以下配置:
--
spring:
# datasource:
# url: "jdbc:hsqldb:mem:testdb" # "jdbc:hsqldb:mem:testdb"|"jdbc:h2:mem:testdb"
# username: "sa"
# password: ""
# initialization-mode: embedded
session:
store-type: jdbc
jdbc:
initialize-schema: embedded
schema: "classpath:org/springframework/session/jdbc/schema-@@platform@@.sql"
table-name: "SPRING_SESSION"
h2:
console: enabled
它不起作用。
我尝试更改 spring.session.jdbc 属性值,但错误相同:
cas | 2020-06-09 09:59:00,336 ERROR [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler] - <Unexpected error occurred in scheduled task>
cas | org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < ?]; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: SPRING_SESSION in statement [DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < ?]
cas | at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:93) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1443) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:862) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:917) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:927) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.session.jdbc.JdbcIndexedSessionRepository.lambda$cleanUpExpiredSessions(JdbcIndexedSessionRepository.java:553) ~[spring-session-jdbc-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
cas | at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.session.jdbc.JdbcIndexedSessionRepository.cleanUpExpiredSessions(JdbcIndexedSessionRepository.java:553) ~[spring-session-jdbc-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
cas | at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) ~[spring-context-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:?]
cas | at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:?]
cas | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) ~[?:?]
cas | at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:?]
cas | at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:?]
cas | at java.lang.Thread.run(Unknown Source) [?:?]
cas | Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: SPRING_SESSION in statement [DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < ?]
cas | at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-3.4.5.jar!/:?]
cas | at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-3.4.5.jar!/:?]
cas | at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1556) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | ... 14 more
cas | Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: SPRING_SESSION
cas | at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserDQL.readTableName(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserDQL.readRangeVariableForDataChange(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserDML.compileDeleteStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserCommand.compilePart(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserCommand.compileStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.Session.compileStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.StatementManager.compile(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.Session.execute(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-3.4.5.jar!/:?]
cas | at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-3.4.5.jar!/:?]
cas | at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1556) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | ... 14 more
有什么问题吗?我还可以检查什么?
谢谢
我回答我自己的问题。
首先,CAS不需要使用共享的Spring会话存储库,因为它主要依靠TGC(Ticket Granting Cookie)来维护集群中的会话。
TGT 存储在 TicketRegistry 中,所有实例都必须访问 TicketRegistry。一种实现是 JpaTicketRegistry(6.2 和以前的版本(非常古老)在 TicketDefinition 中有一个错误,已在 6.3.0RC1 中更正)。
默认行为是在启动和关闭时创建-删除模式。我使用以下配置尝试在启动时更新模式:
#cas.ticket.registry.jpa.ddlAuto=update
最好只在一个实例中启用,在其他实例中禁用:
cas.ticket.registry.jpa.ddlAuto=none
此设置也是必需的,但默认情况下已启用:
#cas.jdbc.genDdl=true
它不生成索引。我创建了以下:
CREATE INDEX CAS.INDEX1 ON CAS.SERVICETICKET
(TICKET_GRANTING_TICKET_ID)
LOGGING
TABLESPACE CAS6DA00
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
);
CREATE INDEX CAS.INDEX2 ON CAS.TICKETGRANTINGTICKET
(TICKET_GRANTING_TICKET_ID)
LOGGING
TABLESPACE CAS6DA00
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
);
与票务登记相关的是 TicketCleaner 实现。在 jpa 中也使用的默认实现必须是 运行 在单个节点中。没有自动主选举,所以你需要让它在一个节点中启用并在所有其他节点中禁用:
cas.ticket.registry.cleaner.schedule.enabled=false
希望对大家有所帮助!
我想在 CAS 6.2-RC5 中使用嵌入式 HSQLDB,我希望 Spring 在启动时对其进行初始化。
首先,我在 cas-overlay-template 中添加了以下依赖项:
implementation "org.apereo.cas:cas-server-support-json-service-registry:${casServerVersion}"
implementation "org.apereo.cas:cas-server-support-ldap:${casServerVersion}"
implementation "org.apereo.cas:cas-server-support-session-jdbc:${casServerVersion}"
#implementation "org.apereo.cas:cas-server-support-jpa-ticket-registry:${casServerVersion}"
其次,我在application.yml中使用了以下配置:
--
spring:
# datasource:
# url: "jdbc:hsqldb:mem:testdb" # "jdbc:hsqldb:mem:testdb"|"jdbc:h2:mem:testdb"
# username: "sa"
# password: ""
# initialization-mode: embedded
session:
store-type: jdbc
jdbc:
initialize-schema: embedded
schema: "classpath:org/springframework/session/jdbc/schema-@@platform@@.sql"
table-name: "SPRING_SESSION"
h2:
console: enabled
它不起作用。
我尝试更改 spring.session.jdbc 属性值,但错误相同:
cas | 2020-06-09 09:59:00,336 ERROR [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler] - <Unexpected error occurred in scheduled task>
cas | org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < ?]; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: SPRING_SESSION in statement [DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < ?]
cas | at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:93) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1443) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:862) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:917) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:927) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.session.jdbc.JdbcIndexedSessionRepository.lambda$cleanUpExpiredSessions(JdbcIndexedSessionRepository.java:553) ~[spring-session-jdbc-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
cas | at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.session.jdbc.JdbcIndexedSessionRepository.cleanUpExpiredSessions(JdbcIndexedSessionRepository.java:553) ~[spring-session-jdbc-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
cas | at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) ~[spring-context-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:?]
cas | at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:?]
cas | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) ~[?:?]
cas | at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:?]
cas | at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:?]
cas | at java.lang.Thread.run(Unknown Source) [?:?]
cas | Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: SPRING_SESSION in statement [DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < ?]
cas | at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-3.4.5.jar!/:?]
cas | at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-3.4.5.jar!/:?]
cas | at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1556) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | ... 14 more
cas | Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: SPRING_SESSION
cas | at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserDQL.readTableName(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserDQL.readRangeVariableForDataChange(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserDML.compileDeleteStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserCommand.compilePart(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.ParserCommand.compileStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.Session.compileStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.StatementManager.compile(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.Session.execute(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source) ~[hsqldb-2.5.0.jar!/:2.5.0]
cas | at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-3.4.5.jar!/:?]
cas | at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-3.4.5.jar!/:?]
cas | at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1556) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615) ~[spring-jdbc-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
cas | ... 14 more
有什么问题吗?我还可以检查什么?
谢谢
我回答我自己的问题。
首先,CAS不需要使用共享的Spring会话存储库,因为它主要依靠TGC(Ticket Granting Cookie)来维护集群中的会话。
TGT 存储在 TicketRegistry 中,所有实例都必须访问 TicketRegistry。一种实现是 JpaTicketRegistry(6.2 和以前的版本(非常古老)在 TicketDefinition 中有一个错误,已在 6.3.0RC1 中更正)。
默认行为是在启动和关闭时创建-删除模式。我使用以下配置尝试在启动时更新模式:
#cas.ticket.registry.jpa.ddlAuto=update
最好只在一个实例中启用,在其他实例中禁用:
cas.ticket.registry.jpa.ddlAuto=none
此设置也是必需的,但默认情况下已启用:
#cas.jdbc.genDdl=true
它不生成索引。我创建了以下:
CREATE INDEX CAS.INDEX1 ON CAS.SERVICETICKET
(TICKET_GRANTING_TICKET_ID)
LOGGING
TABLESPACE CAS6DA00
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
);
CREATE INDEX CAS.INDEX2 ON CAS.TICKETGRANTINGTICKET
(TICKET_GRANTING_TICKET_ID)
LOGGING
TABLESPACE CAS6DA00
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
);
与票务登记相关的是 TicketCleaner 实现。在 jpa 中也使用的默认实现必须是 运行 在单个节点中。没有自动主选举,所以你需要让它在一个节点中启用并在所有其他节点中禁用:
cas.ticket.registry.cleaner.schedule.enabled=false
希望对大家有所帮助!