2013-05-12 156 views
2

,我有以下我的應用程序-config.xml中配置:Spring Security認證簡單的登錄

<security:http auto-config="true" /> 
    <security:global-method-security secured-annotations="enabled" /> 

    <security:authentication-manager> 
     <security:authentication-provider> 
      <security:jdbc-user-service data-source-ref="dataSource" 

       users-by-username-query=" 
        select login, password 
        from accounts where login=? and password=?" 

       authorities-by-username-query=" 
        select a.login, ar.authority from accounts a, account_roles ar 
        where a.account_id = ar.account_id and a.login =? " 

      /> 
     </security:authentication-provider> 
    </security:authentication-manager> 

但是當我開始我的應用程序,它顯示我收到以下錯誤信息登錄:

原因:PreparedStatementCallback;未分類SQL的SQLException [選擇登錄名,>登錄名=>帳戶的密碼和 password =?]; SQL狀態[90012];錯誤代碼[90012];參數「#2」未設置爲 ; SQL語句:選擇登錄名,密碼從 login =?和密碼=? [90012-170];嵌套的異常是 org.h2.jdbc.JdbcSQLException:參數「#2」未設置; SQL 聲明:選擇登錄,密碼從帳戶登錄=?和 password =? [90012-170]

任何想法什麼是錯的?

我不完全確定安全:jdbc-user-service是如何工作的?它在我的select查詢中如何填入=?

我的數據庫定義爲:

CREATE TABLE accounts (
    account_id VARCHAR NOT NULL, 
    login VARCHAR NOT NULL, 
    password VARCHAR NOT NULL, 
    PRIMARY KEY (account_id) 
); 
CREATE TABLE account_roles (
    account_id VARCHAR NOT NULL, 
    authority VARCHAR NOT NULL, 
    PRIMARY KEY (account_id), 
    CONSTRAINT FK_account_roles FOREIGN KEY (account_id) REFERENCES accounts (account_id) 
); 

感謝

回答

3

參數users-by-username-query的名稱意味着,查詢將通過用戶名只能做搜索,所以我建議修改你的SQL查詢來是這樣的:

users-by-username-query="select login, password, 'true' as enabled from accounts where login=? limit 1" 
+0

我也試過,並且得到這個消息: 原因:PreparedStatementCallback;未歸類SQLException for SQL [選擇登錄名,密碼從帳戶登錄=?限制1]; SQL狀態[90008];錯誤代碼[90008];參數「columnIndex」的值「3」無效[90008-170];嵌套異常是org.h2.jdbc.JdbcSQLException:參數「columnIndex」的值「3」無效[90008-170] P.S.我用我的數據庫模式更新了原文。 – 2013-05-12 13:04:37

+0

這是通過應用程序配置,如果這有幫助:http://pastebin.com/NqptCiS4 – 2013-05-12 15:00:50

+0

@ john-sam我已經更新了我的答案。查詢必須返回3個值:'login','password'和'enabled'屬性。因爲你的方案缺少'enabled'屬性,所以我修改了SQL查詢以始終返回'true'。 – 2013-05-12 16:13:13

0

正如Slava指出,如果用戶啓用或不啓用,您需要指示。這裏是對Spring Security 3.2.6.RELEASE:UserDetailsService文檔的參考。以下是這樣說的:

返回的UserDetails是提供保證的認證信息非空準備,比如用戶名,密碼干將接口,授予的權限和用戶帳戶是否啓用或禁用

這是一個有點誤導,如果你只讀了DaoAuthenticationProvider的文檔,其中規定:

它以查找用戶名,密碼和的GrantedAuthority UserDetailsS​​ervice的槓桿(作爲DAO)。它僅通過將UsernamePasswordAuthenticationToken中提交的密碼與UserDetailsS​​ervice加載的密碼進行比較來驗證用戶身份。