我正在尝试通过Cassandra数据库使用spring安全来验证用户。我得到了以下异常:
Authentication request failed: org.springframework.security.authentication.AuthenticationServiceException: PreparedStatementCallback; SQL [select email, lastlogin, password, usertype from login where email=?]; TimedOutException(); nested exception is java.sql.SQLTransientConnectionException: TimedOutException()我厌倦了不断增加的Cassandra超时和所有的一致性级别。我不明白是什么导致了这个错误,同样的查询在Cassandra DevCenter中工作得很好。
以下是配置详细信息:
使用的版本:
<properties>
<java-version>1.7</java-version>
<org.springframework-version>3.2.9.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
<cassandra-driver-core.version>1.0.5-dse</cassandra-driver-core.version>
<jackson.databind-version>2.2.3</jackson.databind-version>
<spring.security.version>3.2.3.RELEASE</spring.security.version>
</properties>Cassandra对pom.xml的依赖:
<dependency>
<groupId>org.apache-extras.cassandra-jdbc</groupId>
<artifactId>cassandra-jdbc</artifactId>
<version>1.2.5</version>
<scope>compile</scope>
</dependency>用于Spring安全的Cussandra数据源定义:
<beans:bean id="cassandraDataSource" class="org.apache.cassandra.cql.jdbc.CassandraDataSource">
<beans:constructor-arg name="host" value="${cassandra.contactpoints}"></beans:constructor-arg>
<beans:constructor-arg name="port" type="int" value="${cassandra.thriftport}"></beans:constructor-arg>
<beans:constructor-arg name="keyspace" value="${cassandra.keyspace}"></beans:constructor-arg>
<beans:constructor-arg name="user" value="${cassandra.user}"></beans:constructor-arg>
<beans:constructor-arg name="password" value="${cassandra.password}"></beans:constructor-arg>
<beans:constructor-arg name="version" value="${cassandra.version}"></beans:constructor-arg>
<beans:constructor-arg name="consistency" value="${cassandra.consistency}"></beans:constructor-arg>
</beans:bean>Cussandra属性:
cassandra.contactpoints=127.0.0.1
cassandra.thriftport=9160
cassandra.port=9042
cassandra.keyspace=styling_bee
cassandra.user=cassandra
cassandra.password=cassandra
cassandra.version=2.0.0
cassandra.consistency=ALLSpring安全配置:
<!-- enable use-expressions -->
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/showyourcloset**" access="hasRole('ROLE_CLIENT')" />
<!-- access denied page -->
<access-denied-handler error-page="/403" />
<form-login
login-page="/login"
default-target-url="/"
authentication-failure-url="/login?error"
username-parameter="email"
password-parameter="password" />
<logout logout-success-url="/login?logout" />
<!-- enable csrf protection -->
<csrf/>
</http>
<!-- Select users and user_roles from database -->
<authentication-manager>
<authentication-provider>
<jdbc-user-service
data-source-ref="cassandraDataSource"
users-by-username-query="select email, lastlogin, password, usertype from login where email=?"
authorities-by-username-query="select roleid, email, rolename from user_roles where email=?" />
</authentication-provider>
</authentication-manager>发布于 2015-02-13 01:00:32
我不知道你是否已经找到了解决方案,但不管怎样,你走错了方向。相反,您必须根据http://docs.spring.io/autorepo/docs/spring-security/3.2.2.RELEASE/apidocs/org/springframework/security/core/userdetails/UserDetailsService.html实现您自己的UserDetailsService。
https://stackoverflow.com/questions/26135959
复制相似问题