【问题标题】:What is org.h2.jdbc.JdbcSQLDataException: Invalid value "3" for parameter "columnIndex" [90008-200]?什么是 org.h2.jdbc.JdbcSQLDataException:参数“columnIndex”[90008-200] 的值“3”无效?
【发布时间】:2020-11-21 06:54:15
【问题描述】:

当我遇到下面的错误消息时,我正在尝试对我的 spring 安全性使用 JDBC 身份验证。我正在尝试将 User 类中的所有电子邮件和密码注册为有效登录名。我不确定我的 sql 语句或我的 User 类是否有问题。如有帮助,请提供任何帮助!

Caused by: org.h2.jdbc.JdbcSQLDataException: 
Invalid value "3" for parameter "columnIndex" [90008-200]

春季安全

    @Autowired      
    public void configure(AuthenticationManagerBuilder auth)
                throws Exception {          
           auth.jdbcAuthentication()
                // To find logins in the h2 database
                .dataSource(dataSource)
                .usersByUsernameQuery("select email, password " +
                                "from User " +
                                "where email = ?")
                .authoritiesByUsernameQuery("select email, role " +
                                "from User " +
                                "where email =?");
 
     }

用户类

     @Entity
     public class User {
        private String firstName;
        private String lastName;
        @Size(min = 6, message ="Enter at least 6 characters")
        @ValidPassword
        private String password;
        private String matchingPassword;
        private String passportNumber;
        private String address;
        private String phoneNumber;
        @ValidEmail
        private String email;
        
        // Mark as primary key
        @Id
        // Will be auto generated
        @GeneratedValue
        private long id;
        private String role;
    
        
    
        public User(@NotNull String firstName, @NotNull String lastName,
                @Size(min = 6, message = "Enter at least 6 characters") @NotNull String password,
                @NotNull String passportNumber, @NotNull String address, @NotNull String phoneNumber, String email,
                String role) {
            super();
            this.firstName = firstName;
            this.lastName = lastName;
            this.password = password;
            this.passportNumber = passportNumber;
            this.address = address;
            this.phoneNumber = phoneNumber;
            this.email = email;
            this.role = role;
        }
    
        @Override
        public String toString() {
            return "User [firstName=" + firstName + ", lastName=" + lastName + ", password=" + password
                    + ", matchingPassword=" + matchingPassword + ", passportNumber=" + passportNumber + ", address="
                    + address + ", phoneNumber=" + phoneNumber + ", email=" + email + ", id=" + id + ", role=" + role + "]";
        }
    
        public String getRole() {
            return role;
        }
    
        public void setRole(String role) {
            this.role = role;
        }
    
        
    
    
    
        public String getPassword() {
            return password;
        }
    
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    
        public String getMatchingPassword() {
            return matchingPassword;
        }
    
    
        public void setMatchingPassword(String matchingPassword) {
            this.matchingPassword = matchingPassword;
        }
    
    
        public String getFirstName() {
            return firstName;
        }
    
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
    
        public String getLastName() {
            return lastName;
        }
    
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
    
        public String getPassportNumber() {
            return passportNumber;
        }
    
    
        public void setPassportNumber(String passportNumber) {
            this.passportNumber = passportNumber;
        }
    
    
        public String getAddress() {
            return address;
        }
    
    
        public void setAddress(String address) {
            this.address = address;
        }
    
    
        public String getPhoneNumber() {
            return phoneNumber;
        }
    
    
        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }
    
    
    
        public void setId(long id) {
            this.id = id;
        }
    
    
        protected User() {
            
        }
    
        public long getId() {
            return id;
        }
    
    }

编辑:这个问题的答案标记在下面

【问题讨论】:

    标签: mysql spring spring-boot jdbc spring-security


    【解决方案1】:
    • Spring 安全性需要 3 列用于 usersByUserName 查询。如果您不指定,这是使用的默认查询。
        public static final String DEF_USERS_BY_USERNAME_QUERY 
            = "select username, password, enabled from users where username = ?";
    
    
    • 因此,如果您没有此类用于启用和禁用用户的列,请使用以下查询
        select email, password, 'true' as enabled from User where email = ?
    

    参考

    https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/userdetails/jdbc/JdbcDaoImpl.html

    【讨论】:

    • 如果我没有启用列怎么办?
    猜你喜欢
    • 2016-04-02
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2015-07-06
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多