若依默认集成了账号、密码,验证码登录,我们现在自定义认证接口
编写自定义token,后续用,继承 AbstractAuthenticationToken
public class UserIdAuthenticationToken extends AbstractAuthenticationToken {
private final Object principal;
public UserIdAuthenticationToken(Object principal) {
super(null);
this.principal = principal;
this.setAuthenticated(false);
}
public UserIdAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {
super(authorities);
this.principal = principal;
super.setAuthenticated(true);
}
@Override
public Object getCredentials() {
return null;
}
@Override
public Object getPrincipal() {
return this.principal;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
if (isAuthenticated) {
throw new IllegalArgumentException(
"Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
}
super.setAuthenticated(false);
}
@Override
public void eraseCredentials() {
super.eraseCredentials();
}
}
编写认证类,实现AuthenticationProvider接口
@Component
public class UserIdAuthenticationProvider implements AuthenticationProvider {
@Autowired
private UserDetailsServiceImpl userDetailsService;
/**
* 认证逻辑
*/
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
UserIdAuthenticationToken userIdToken = (UserIdAuthenticationToken) authentication;
String userId = (String) userIdToken.getPrincipal();
UserDetails user = userDetailsService.loadUserByUserId(userId);
UserIdAuthenticationToken result = new UserIdAuthenticationToken(user, Collections.emptyList());
/*
Details 中包含了 ip地址、 sessionId 等等属性 也可以存储一些自己想要放进去的内容
*/
result.setDetails(userIdToken.getDetails());
return result;
}
/**
*UserIdAuthenticationToken交给UserIdAuthenticationProvider处理
* @param aClass
* @return
*/
@Override
public boolean supports(Class<?> aClass) {
return UserIdAuthenticationToken.class.isAssignableFrom(aClass);
}
}
编写获取用户信息逻辑
配置认证器
编写controller,配置过滤地址
编写服务实现
自定义认证登录接口集成完毕!