java - SQL 列索引超出范围 spring-security

标签 java mysql spring-mvc spring-security

这个对我来说毫无意义,因为我确定一切都在那里

这是我在登录表单中得到的

Your login attempt was not successful, try again. Reason: PreparedStatementCallback; SQL [SELECT user_name, user_password, enabled, email_address, id, user_first_name, user_last_name FROM user WHERE user_name = ?]; Column Index out of range, 8 > 7. ; nested exception is java.sql.SQLException: Column Index out of range, 8 > 7. .

applicationContext-security.xml文件中用于认证的bean

      <beans:bean id="customUserDetailsService" class="com.au.dealclick.implementations.CustomJdbcDaoImpl">
      <beans:property name="dataSource" ref="dataSource"/>
      <beans:property name="usersByUsernameQuery" value="SELECT user_name, user_password, enabled, email_address, id, user_first_name, user_last_name, city FROM user WHERE user_name = ?"/>
      <beans:property name="authoritiesByUsernameQuery" value="SELECT user_name , R.name FROM user U, roles R WHERE U.roles = R.Id AND user_name=?"/>
      </beans:bean>

这是customJdbcDaoImpl.java文件

package com.au.dealclick.implementations; 

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.context.ApplicationContextException;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.MappingSqlQuery;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;
import org.springframework.security.core.authority.AuthorityUtils;
import com.au.dealclick.implementations.UserDetailsImplementation;

public class CustomJdbcDaoImpl extends JdbcDaoImpl {

private MappingSqlQuery usersByUsernameMapping;


@Override
protected void initDao() throws ApplicationContextException {
super.initDao();
this.usersByUsernameMapping = new CustomUsersByUsernameMapping(getDataSource());
}

@Override
protected List<UserDetails> loadUsersByUsername(String username) {
return usersByUsernameMapping.execute(username);
}

@Override
protected UserDetails createUserDetails(String username, UserDetails userFromUserQuery,
List<GrantedAuthority> combinedAuthorities) {
UserDetails u = super.createUserDetails(username, userFromUserQuery, combinedAuthorities);
UserDetailsImplementation user = new UserDetailsImplementation(u.getUsername(), u.getPassword(), u.isEnabled(), u.isAccountNonExpired(), u.isCredentialsNonExpired(), u.isAccountNonLocked(), u.getAuthorities());
UserDetailsImplementation customUserFromUserQuery = (UserDetailsImplementation) userFromUserQuery;
user.setEmailAddress(customUserFromUserQuery.getEmailAddress());
user.setId(customUserFromUserQuery.getId());
user.setFirstName(customUserFromUserQuery.getFirstName());
user.setLastName(customUserFromUserQuery.getLastName());
user.setCityId(customUserFromUserQuery.getCityId());
return user;
}

private class CustomUsersByUsernameMapping extends MappingSqlQuery {
protected CustomUsersByUsernameMapping(DataSource dataSource) {
super(dataSource, getUsersByUsernameQuery());
declareParameter(new SqlParameter(Types.VARCHAR));
compile();
}

protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
String username = rs.getString(1);
String password = rs.getString(2);
boolean enabled = rs.getBoolean(3);
String email = rs.getString(4);
Long id = rs.getLong(5);
//Reference city
String firstName = rs.getString(6);
String lastName = rs.getString(7);
Long city = rs.getLong(8);
UserDetailsImplementation user = new UserDetailsImplementation(username, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES);
user.setEmailAddress(email);
user.setId(id);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setCityId(city);
return user;
}
}
}

这是 userDetailsImplementation.java 文件

package com.au.dealclick.implementations; 

import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.Authentication;
import java.security.*;
import javax.persistence.*;
import java.lang.*;
import org.springframework.security.core.GrantedAuthority;
import java.util.*;
import com.au.dealclick.domain.Location;
public class UserDetailsImplementation extends User{

    public UserDetailsImplementation(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, List<GrantedAuthority> authorities) {
      super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
    }
    public UserDetailsImplementation(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<GrantedAuthority> authorities) {
      super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
    }
    private Long id;
    private String userFirstName;
    private String userLastName;
    private String emailAddress;
    private Long city;

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getFirstName() { return userFirstName; }
    public void setFirstName(String userFirstName) { this.userFirstName = userFirstName; }

    public String getLastName() { return userLastName; }
    public void setLastName(String userLastName) { this.userLastName = userLastName; }

    public Long getCityId() { return city; }
    public void setCityId(Long city) { this.city = city; }

    public String getEmailAddress() { return emailAddress; }
    public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; }
}

最佳答案

您运行的 applicationContext-security.xml 文件是否可能不是您发布的文件?这可能与您的构建由于某种原因没有将文件复制到运行时位置有关。

您正在运行的应用程序是如何部署的?例如WAR、WAR exploded、standalone jar 等。尝试将运行时位置中的文件与源位置中的文件进行比较。

关于java - SQL 列索引超出范围 spring-security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8246363/

相关文章:

java - 从 Spring 3.0 开始用 SpEL 替换 JSP 中的 EL

java - 如何将 while 循环的每个循环的速度设置为恒定?

java - 绑定(bind)到 c# 一些使用 .so 库的 java 代码

java - 如何使用 java 的 ImageIO 保存优化的 png 图像?

java - 使主要接受字符串以外的对象?

mysql - 如何每小时在 Amazon RDS 上进行一次数据库备份?

java - 无法找到 Spring 框架的 4.0.6 jar 文件?

MySQL "Show table status",自动增量不正确

MySQL:有没有办法有条件地 LEFT JOIN? (或类似的?)

java - SPRING MVC Controller 注释与 xml