2014-10-01 51 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