spring安全登录无法使用oracle

时间:2012-11-07 10:37:02

标签: oracle spring hibernate spring-mvc spring-security

我正在使用jdbc-user-service进行spring security登录。它正在使用Mysql但不在oracle上。我正在使用oracle 11 XE。

我在标记中提到的查询是正确的,因为当我在oracle控制台上运行时,这些查询会返回预期的行。

数据源是:

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="url" value="${datasource.url}" />
    <property name="username" value="${jdbc.user}" />
    <property name="password" value="${jdbc.password}" />
</bean>

在sessionFactory bean中给出了用于oracle的hibernate方言。

<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>

相同的代码适用于mysql而不适用于oracle。应用程序控件被重定向到我在spring安全文件中设置的登录页面。这意味着它正在获取用户名&amp;密码正确。

<form-login login-page="/landing" default-target-url="/home"
        authentication-failure-url="/landing?msg=cw" />

spring security xml中的身份验证提供程序代码是:

<authentication-manager>
    <authentication-provider>
    <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query=" 
    select USERNAME as username, PASSWORD as password,'true' as enabled from 
    users where USERNAME=?"

            authorities-by-username-query=" select u.USERNAME 
    as username, r.ROLE as authority from users u, roles r, user_roles 
    ur where u.USER_ID = ur.USER_ID and ur.ROLE_ID = r.id and u.USER_ID = (SELECT 
    USER_ID from users where USERNAME = ?)" />

    </authentication-provider>
</authentication-manager>

为了在spring security中使用oracle,是否需要配置什么?

更新:我设置了spring security debug,这是我尝试登录后打印的内容。

INFO : Spring Security Debugger - 

************************************************************

Request received for '/j_spring_security_check':

org.apache.catalina.connector.RequestFacade@7262b6

servletPath:/j_spring_security_check
pathInfo:null

  Security filter chain: [
  ConcurrentSessionFilter
  SecurityContextPersistenceFilter
  LogoutFilter
  UsernamePasswordAuthenticationFilter
  BasicAuthenticationFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  FilterSecurityInterceptor
]


************************************************************


INFO : Spring Security Debugger - 

************************************************************

Request received for '/landing?msg=cw':

org.apache.catalina.connector.RequestFacade@bf1a4a

servletPath:/landing
pathInfo:null

Security filter chain: [
ConcurrentSessionFilter
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
BasicAuthenticationFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
]


************************************************************

2 个答案:

答案 0 :(得分:2)

我有同样的问题,经过数小时的研究后我找到了解决方案。 Spring安全性的用户详细信息需要启用布尔值,而Oracle上的“true”不起作用。我解决了这个问题:

users-by-username-query=" 
select USERNAME as username, PASSWORD as password,'true' as enabled from 
users where USERNAME=?"

对此:

users-by-username-query=" 
select USERNAME as username, PASSWORD as password,1 as enabled from 
users where USERNAME=?"

它有效!我发现解决方案为here

答案 1 :(得分:0)

确保您的类路径中有ojdbc6.jar或ojdbc14.jar(待定Oracle版本)。