spring 安全在哪里取值来代替通配符?

where does spring security takes values to replace wild card?

我已阅读以下文章:

jdbc-user-service-based-spring-security-example

spring配置:

<authentication-manager alias="authenticationManager">
    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"

       users-by-username-query="
         SELECT USERNAME, PASSWORD, CASE ENABLED WHEN 1 THEN 'true' ELSE 'false' END 'ENABLED'
         FROM TBL_USERS
         WHERE USERNAME=?;"

       authorities-by-username-query="
        SELECT u.USERNAME, r.ROLENAME
        FROM TBL_USERS u, TBL_USER_ROLE r
        WHERE u.ID = r.USERID
        AND u.USERNAME=?;"

        />
    </authentication-provider>
</authentication-manager>

让我们研究以下片段:

users-by-username-query="
             SELECT USERNAME, PASSWORD, CASE ENABLED WHEN 1 THEN 'true' ELSE 'false' END 'ENABLED'
             FROM TBL_USERS
             WHERE USERNAME=?;"

据我了解以下查询是查询所有用户是否可以登录。
据我了解,这类似于准备好的陈述。但是当我们使用准备好的语句时,我们会这样写:

preparedStatement.setString(1, "John");

我不明白 spring 在哪里用 USERNAME 值替换 ?

用户名是您在验证时提交的用户名,随后传递给 UserDetailsService。如果您查看 the code for the JDBC version.

,您可以看到实际替换发生的位置

它使用 Spring 的 JdbcTemplate 和它调用的 query method 替换准备好的语句中的参数。