我尝试在我的网络应用中使用带有LDAP的Spring安全性实现登录成功处理程序。在线搜索后,我找到的唯一方法是实现自定义用户详细信息映射器,如下所示:
public class CustomUserDetailsMapper extends LdapUserDetailsMapper{
private static final String ROLE_NORMAL_USER = "Normal User";
private static final String ROLE_ADMIN = "Administrator";
@Override
public UserDetails mapUserFromContext(DirContextOperations ctx,
String username, Collection<? extends GrantedAuthority> authority) {
UserDetails originalUser = super.mapUserFromContext( ctx, username, authority );
originalUser.getAuthorities();
Set<AndaAuthority> roles = EnumSet.noneOf(AndaAuthority.class);
roles.add(AndaAuthority.ROLE_ADMIN);
for (GrantedAuthority auth : authority) {
if (ROLE_NORMAL_USER.equalsIgnoreCase(auth.getAuthority())) {
roles.add(AndaAuthority.ROLE_USER);
} else if (ROLE_ADMIN.equalsIgnoreCase(auth.getAuthority())) {
roles.add(AndaAuthority.ROLE_ADMIN);
}
}
SecurityContextHolder.getContext().getAuthentication().getCredentials();
User newUser =
new User(
originalUser.getUsername(),
originalUser.getPassword() != null? originalUser.getPassword():"",
originalUser.isEnabled(),
originalUser.isAccountNonExpired(),
originalUser.isCredentialsNonExpired(),
originalUser.isAccountNonLocked(),
roles );
return newUser;
}
}
这是有效的 - 当我在此处设置断点时,它停止了。但是,有没有更好的方法来实现这种情况的处理程序?我的意思是,整个身份验证部分是在“引擎盖下”完成的,如果出现问题并且没有调用此方法我无法进行调试,我无法通过其他方式知道路上出错的地方。
谢谢
答案 0 :(得分:1)
对于其他任何想知道: 您必须将成功处理程序声明为bean,以便可以在Spring安全配置中将其链接。
here的实施效果很好,
您只需在authentication-success-handler-ref
配置标记中声明<form-login>
并覆盖onAuthenticationSuccess
方法即可。
可能存在其他更好的解决方案,但这是我在我的案例中找到和工作的解决方案。