2011-12-07 98 views
0

無法使Spring Security與數據庫身份驗證提供程序一起使用。
內存認證提供程序正常工作。Spring Security:數據庫身份驗證提供程序

步驟重現:
當我登錄憑證與sbsb,的AuthenticationServicelogin()方法返回false
Tomcat沒有相關的日誌。

的applicationContext.xml:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost/chirokDB?useUnicode=true&amp;characterEncoding=utf8"/> 
    <property name="username" value="root"/> 
    <property name="password" value="root"/> 
</bean> 

<bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> 
     <property name="dataSource" ref="dataSource"/> 
</bean> 

服務層:

@Service("authenticationService") 
    public class AuthenticationServiceImpl implements AuthenticationService { 
    @Resource(name = "authenticationManager") 
    private AuthenticationManager authenticationManager; 
     public boolean login(String username, String password) { 
     try { 
     Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(
        username, password)); 
      if (authenticate.isAuthenticated()) { 
    SecurityContextHolder.getContext().setAuthentication(authenticate); 
        return true; 
       } 
      } catch (AuthenticationException e) { 
      } 
      return false; 
    } 

託管bean級別:

public String doLogin() { 
    boolean isLoggedIn = authenticationService.login(name, password); 
    if (isLoggedIn) { 
     return "index"; 
    } 
    FacesContext.getCurrentInstance().addMessage("login failure", new FacesMessage()); 
    return "failureLogin"; 
} 

的applicationContext-security.xml文件:

<global-method-security pre-post-annotations="enabled"/> 
    <http auto-config="true"> 
    <form-login login-page="/login.xhtml" default-target-url="/index.xhtml"/> 
     <intercept-url pattern="/contacts.xhtml" access="ROLE_ANONYMOUS,ROLE_USER"/> 
     <intercept-url pattern="/delivery.xhtml" access="ROLE_USER"/> 
     <logout invalidate-session="true"/> 
     <session-management> 
      <concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/> 
     </session-management> 
    </http>   

    <authentication-manager alias="authenticationManager"> 
     <authentication-provider> 
      <jdbc-user-service data-source-ref="dataSource"/> 
     </authentication-provider> 
    </authentication-manager> 

持續電平:
MySql DB具有以下標準表(由Spring必需):
1.用戶
2.當局

users表有記錄,用戶名='sb'和密碼='sb'
authorities表有用戶名記錄= 'SB' 和權威= 'ROLE_USER'


與用戶內存中所有可與以下配置OK:

<authentication-manager alias="authenticationManager"> 
     <authentication-provider> 
      <user-service> 
       <user name="sb" password="sb" authorities="ROLE_USER"/> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 

假設:
dataSource注入org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl
至於Hibernate使用的ORM,或許應該使用JdbcDaoImpl以外的其他應用程序?

+0

從何種意義上說它不起作用? – jtoberon

+0

jtoberon,我已更新我的帖子。請參閱「步驟重現」部分。 – sergionni

+0

什麼是AuthenticationService? – jtoberon

回答

1

檢查你是否在空的catch塊中得到了Exception(這總是一個壞主意)。

+0

jtoberon,謝謝你的提示,我有:'PreparedStatementCallback;錯誤的SQL語法[select username,password,enabled from users where username =?]' – sergionni

+0

continue:'org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;錯誤的SQL語法[選擇用戶名,密碼,從用戶名=?開啓];嵌套異常是com.mysql.jdbc.exceptions.jdbc4。MySQLSyntaxErrorException:'字段列表'中的未知列'enabled'看起來我應該提供一個字段,稱爲'enabled',但爲什麼?我根據Spring文檔創建了表用戶。 – sergionni

+0

哦,我錯了,有這樣的領域,稱爲'enabled':http://static.springsource.org/spring-security/site/docs/3.0.x/reference/appendix-schema.html – sergionni

相關問題