弹簧安全性受损增加了一个方面

时间:2018-06-26 13:17:12

标签: java spring spring-security aop spring-aop

我刚刚创建了一个方面来验证我的登录方法中的输入参数。我有一个在Spring安全性(Spring 4.2.1.RELEASE)中实现UserDetailsS​​ervice接口的服务。现在,我的方面非常简单,只需调用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时,一切运行正常。我在这里想念的是什么?

1 个答案:

答案 0 :(得分:0)

是的,就是这样

@Around(value="@annotation(LoginAnnotation)")
public Object loadByUserNameLoginValidation(ProceedingJoinPoint joinPoint) throws Throwable {
    return joinPoint.proceed();
}

结果必须从方面返回,否则为空。