Java Spring安全性允许用户名的替代方案

Java Spring安全性允许用户名的替代方案,java,spring,security,login,Java,Spring,Security,Login,我正在使用SpringSecurity3.x。在我的登录页面中,有一个附加字段,用户可以扫描身份证来填充该字段。如果他们这样做,则不需要用户名(根据扫描的ID查找用户名),但密码仍然是必需的 问题是我的自定义身份验证提供程序需要用户名。该ID被捕获在此之前的筛选器中(UsernamePasswordAuthenticationFilter)。我不知道如何连接它们,所以我的AuthProvider知道它不需要用户名(而且,由于它传递了一个身份验证对象,它是如何在此时获取ID的?)。我扩展的过滤器是

我正在使用SpringSecurity3.x。在我的登录页面中,有一个附加字段,用户可以扫描身份证来填充该字段。如果他们这样做,则不需要用户名(根据扫描的ID查找用户名),但密码仍然是必需的


问题是我的自定义
身份验证提供程序需要用户名。该ID被捕获在此之前的筛选器中(
UsernamePasswordAuthenticationFilter
)。我不知道如何连接它们,所以我的
AuthProvider
知道它不需要用户名(而且,由于它传递了一个身份验证对象,它是如何在此时获取ID的?)。

我扩展的过滤器是FORM\u LOGIN\u过滤器,这是正确的,但是我需要执行所有检索(j\u用户名,j\u密码)单击此处并手动调用身份验证管理器,而不是调用super()方法,该方法将检索和身份验证管理器调用传递给Spring。这还需要扩展UsernamePasswordAuthenticationToken。一旦我这样做,它们就连接起来了。

您可能需要一种特殊的身份验证接口,它不是UsernamePasswordAuthenticationToken,因此不需要用户名和密码。 然后,您的AuthenticationProcessingFilter/AuthenticationProvider可以创建其中一个。
以spring cas客户端为例。

我相信我可能在这里偶然找到了答案:关键是,不要在我的筛选器末尾调用super.attemptAuthentication(req,resp)让Sprind处理用户名/密码,自己获取用户名/密码/id,使用它们创建身份验证令牌,并将其传递给身份验证管理器。仍在测试…是的,我扩展了UsernamePasswordAuthenticationToken以添加所需的附加字段。过滤器/提供者现在使用添加的字段实例化我的自定义令牌,并且过滤器手动对用户名/密码进行检索,有效地绕过了对用户名/密码的任何Spring验证检查。