我刚刚创建了一个方面来验证我的登录方法中的输入参数。我有一个在Spring安全性(Spring 4.2.1.RELEASE)中实现UserDetailsService接口的服务。现在,我的方面非常简单,只需调用jointPoint.proceed(),但尚未验证输入参数:
@Aspect
public class LoginAspect {
@Around(value="@annotation(LoginAnnotation)")
public void loadByUserNameLoginValidation(ProceedingJoinPoint joinPoint) throws Throwable {
joinPoint.proceed();
}
}
我的服务:
@LoginAnnotation
public class MyUserDetailService implements UserDetailsService {
//Retrieve User Details from database
@LoginAnnotation
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
//Retrieve user details code
//.....
//.....
return userDetails;
}
}
调试代码,我发现Spring的DaoAuthenticationProvider.retrieveUser方法中的loadedUser为空:
if (loadedUser == null) {
throw new InternalAuthenticationServiceException(
"UserDetailsService returned null, which is an interface contract violation");
}
当我从服务中删除自定义批注@LoginAnnotation时,一切运行正常。我在这里想念的是什么?
答案 0 :(得分:0)
是的,就是这样
@Around(value="@annotation(LoginAnnotation)")
public Object loadByUserNameLoginValidation(ProceedingJoinPoint joinPoint) throws Throwable {
return joinPoint.proceed();
}
结果必须从方面返回,否则为空。