2014-10-01 50 views
0

我正在使用PostgreSQL作爲數據庫的Spring-MVC應用程序。我在數據庫中有一個名爲'registration'的表,並試圖查看數據庫中輸入的用戶名和密碼是否與用戶輸入的內容匹配。我收到PostGres錯誤。我在分配模型本身的作用,現在,如下所述:Spring安全框架JDBC查詢

定義模型的作用:

class User { 
     private static final GrantedAuthority USER_AUTH = new SimpleGrantedAuthority("ROLE_USER"); 
private String Username; 
private String password; 
private String role="ROLE_USER"; 
    @Transient 
    private List<GrantedAuthority> authorities; 
    public User() { 
      this.authorities = new ArrayList<GrantedAuthority>(); 
      authorities.add(USER_AUTH); 
    } 
public User(String Username, String password, String Role){ 
     this.Username = Username; 
     this.password = password; 
     this.role = Role; 

    } 

    } 

錯誤代碼:

Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [select username,password from registration where username=?]; The column index is out of range: 3, number of columns: 2.; nested exception is org.postgresql.util.PSQLException: The column index is out of range: 3, number of columns: 2. 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:100) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:787) 
    at org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl.loadUsersByUsername(JdbcDaoImpl.java:192) 
    at org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl.loadUserByUsername(JdbcDaoImpl.java:151) 
    at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:102) 
    ... 38 more 
Caused by: org.postgresql.util.PSQLException: The column index is out of range: 3, number of columns: 2. 
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkColumnIndex(AbstractJdbc2ResultSet.java:2866) 
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkResultSet(AbstractJdbc2ResultSet.java:2883) 
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBoolean(AbstractJdbc2ResultSet.java:1989) 
    at org.apache.commons.dbcp.DelegatingResultSet.getBoolean(DelegatingResultSet.java:216) 
    at org.apache.commons.dbcp.DelegatingResultSet.getBoolean(DelegatingResultSet.java:216) 
    at org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl$1.mapRow(JdbcDaoImpl.java:196) 
    at org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl$1.mapRow(JdbcDaoImpl.java:192) 
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) 
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60) 
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:708) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644) 

安全-的applicationContext.xml

<security:authentication-manager alias="authenticationManager"> 
     <security:authentication-provider > 
      <security:jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password 
       from registration where username=?" authorities-by-username-query="select u.username, r.Role from registration where u.username=?" /> 
      </security:authentication-provider> 
    </security:authentication-manager> 
+0

注意:我有角色與用戶保存在同一張表中。 – 2014-10-01 09:28:19

回答

0

當您使用JdbcDaoImpl時,usersByUsernameQuery必須返回3 pa rameters:用戶名,密碼,並啓用,你查詢只返回2,所以錯誤。您的查詢應該是:

select username,password,true from registration where username=? 

而你的authorities-by-username-query也是不正確的。我不知道如何聲明registration表,但我想它應該是:

select username, role from registration where username=? 
+0

謝謝。我做了這個改變。查詢的第二部分是否正確,因爲我的角色與我的用戶信息在同一個表中?我應該如何檢查這個用戶是否有正確的用戶名和密碼進行驗證? – 2014-10-01 11:19:21

+0

對於第二個問題,Spring安全性會爲您檢查密碼。對於第一部分,你的請求是錯誤的。看到我編輯的答案 – 2014-10-01 11:53:41

+0

謝謝。是。我已經在註冊表中聲明瞭用戶名和角色作爲Varchar。和我的用戶類中的字符串。現在,當我嘗試進行身份驗證時,角色將作爲空傳遞。但正如您從我班的第一行中可以看到的,我正在授予ROLE_USER。我在主要問題中添加User類。請看看。 – 2014-10-01 12:03:20