2

我在 app-config.xml 中配置了以下内容:

<security:http auto-config="true" />
    <security:global-method-security secured-annotations="enabled" />

    <security:authentication-manager>
        <security:authentication-provider>
            <security:jdbc-user-service data-source-ref="dataSource"

                users-by-username-query="
                  select login, password 
                  from accounts where login=? and password=?" 

                authorities-by-username-query="
                  select a.login, ar.authority from accounts a, account_roles ar 
                  where a.account_id = ar.account_id and a.login =?  " 

            />
        </security:authentication-provider>
    </security:authentication-manager>

但是,当我启动我的应用程序时,它会显示登录信息,我收到以下错误消息:

原因:PreparedStatementCallback;未分类 SQLException for SQL [select login, > password from accounts where login=? 和密码=?]; SQL 状态 [90012];错误代码 [90012];未设置参数“#2”;SQL 语句:select login, password from accounts where login=? 和密码=?[90012-170];嵌套异常是 org.h2.jdbc.JdbcSQLException:未设置参数“#2”;SQL 语句:select login, password from accounts where login=? 和密码=?[90012-170]

有什么想法有什么问题吗?

我不完全确定 security:jdbc-user-service 是如何工作的?它如何填写我的选择查询中的=?

我的数据库定义为:

CREATE TABLE accounts (
  account_id VARCHAR NOT NULL,
  login VARCHAR NOT NULL,
  password VARCHAR NOT NULL,
  PRIMARY KEY (account_id)
);
CREATE TABLE account_roles (
  account_id VARCHAR NOT NULL,
  authority VARCHAR NOT NULL,
  PRIMARY KEY (account_id),
  CONSTRAINT FK_account_roles FOREIGN KEY (account_id) REFERENCES accounts (account_id)
);

谢谢

4

2 回答 2

3

参数名称users-by-username-query意味着查询将仅按用户名进行搜索,因此我建议将您的 SQL 查询修改为如下内容:

users-by-username-query="select login, password, 'true' as enabled from accounts where login=? limit 1"
于 2013-05-12T12:57:21.907 回答
0

正如 Slava 指出的那样,您需要指示用户是否已启用。这里参考 Spring Security 3.2.6.RELEASE: UserDetailsS ​​ervice 的文档。这是它所说的:

返回的 UserDetails 是一个提供 getter 的接口,该接口保证提供非空的身份验证信息,例如用户名、密码、授予的权限以及用户帐户是启用还是禁用

如果您只阅读DaoAuthenticationProvider的文档,这有点误导,其中指出:

它利用 UserDetailsS​​ervice(作为 DAO)来查找用户名、密码和 GrantedAuthority 。它只需将在 UsernamePasswordAuthenticationToken 中提交的密码与 UserDetailsS​​ervice 加载的密码进行比较,即可对用户进行身份验证。

于 2015-03-21T13:56:31.330 回答