2

我正在开发一个带有 Spring Security 设置的 Spring MVC 应用程序,该设置通过 LDAP 对 Active Directory 用户进行身份验证。我正在尝试设置 AOP 来记录每个被调用的控制器方法。我一切正常,我可以拦截该方法..但我似乎无法访问 SecurityContext 来获取正在执行该方法的登录用户的用户名。

UserInvokedMethodLogger.java

public class UserInvokedMethodLogger implements MethodInterceptor
{
    private SecurityContext security = SecurityContextHolder.getContext();

    @Override
    public Object invoke(MethodInvocation interceptedMethod) throws Throwable
    {
        long start = System.currentTimeMillis();
        Object result = interceptedMethod.proceed();
        long end = System.currentTimeMillis();

        String dbgMessage =
                (security.getAuthentication() != null)
                    ? "User '" + security.getAuthentication().getName() + "' called method '"
                    : "Unauthenticated user called method '"
                + interceptedMethod.getMethod().getName()
                + "' which executed in " + (end - start) + "ms.";

        System.out.println(dbgMessage);
        return result;
    }
}

即使我登录,输出始终是“未经身份验证的用户”。

4

1 回答 1

3

尝试在每个方法调用期间调用 SecurityContextHolder.getContext()。只需删除您的private SecurityContext security属性并直接使用 SecurityContextHolder.getContext() 即可。

于 2013-07-03T15:55:49.517 回答