如何在MethodInterceptor中访问SecurityContext?

时间:2013-07-03 15:46:47

标签: java spring spring-security spring-aop

我正在使用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;
    }
}

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

1 个答案:

答案 0 :(得分:3)

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