我试图不显示用户使用spring security的无效尝试。我使用自定义User类来获取除用户名和密码之外的其他用户详细信息。我创建了两个监听器类,即AuthenticationSuccessEventListener& AuthenticationFailureListener用于更新用户的无效尝试。
现在在onApplicationEvent方法中,我正在尝试获取自定义User对象(CustomUserDetails),如下所示:
@Component
public class AuthenticationFailureListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {
@Autowired
private ILoginDAO loginDAO ;
@Override
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {
CustomUserDetails user = (CustomUserDetails)event.getAuthentication().getPrincipal();//I get ClassCastException here.
String strUserID = user.getUserID();
CustomUserDetails customUser = loginDAO.loadUserByUsername(strUserID);
if (customUser != null){
...
} } }
event.getAuthentication()。getPrincipal()返回一个String,即我试图将其强制转换为CustomUserDetails(自定义用户类)的用户名,我收到错误。
P.S - 我在登录页面输入用户名/密码,因此我将userid作为参数传递给所有方法,包括loadUserByUsername(strUserID)。
如何从AuthenticationFailureBadCredentialsEvent / AuthenticationSuccessEvent对象中获取侦听器类中的自定义User对象?
答案 0 :(得分:1)
该事件只包含身份验证请求对象,即传递给Authentication
但失败的AuthenticationManager
。因此它将包含提交的用户名作为主体。
身份验证可能由于各种原因而失败,包括不存在的用户名,实际上根本不需要涉及UserDetails
对象,因此如果您需要完整的信息,则需要使用用户名加载它。
或者,您可以自定义AuthenticationProvider
以在实现本身中执行您想要的其他工作,而不是通过事件。