2014-10-01 5 views
0

Я работаю над приложением Spring-MVC с PostgreSQL в качестве базы данных. У меня есть таблица в базе данных с именем «registration» и попытка проверить, совпадают ли имя пользователя и пароль в базе данных того, что пользователь вводил. Я получаю сообщение PostGres. Я задаю роль в самой модели прямо сейчас, как указано ниже:Spring Security framework 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) 

Security-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

Примечание: У меня есть роль, сохраненная в той же таблице, что и пользователь. –

ответ

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

Спасибо. Я сделал это изменение. Правильна ли вторая часть запроса, так как моя роль находится в той же таблице, что и моя пользовательская информация? Как проверить, имеет ли этот пользователь правильное имя пользователя и пароль для проверки? –

+0

Для вашего второго вопроса, Spring Security проверяет пароль для вас. Для первой части ваш запрос неверен. См. Мой отредактированный ответ –

+0

Спасибо. Да. Я указал как имя пользователя, так и роль Varchar в регистрационной таблице. И как String в моем классе User. Теперь, когда я пытаюсь выполнить аутентификацию, роль получает значение null. Но, как видно из первой строки моего класса, я предоставляю ROLE_USER. Я добавляю класс User в основной вопрос. Пожалуйста, посмотрите. –

Смежные вопросы