2013-06-27 1 views
2

У меня есть интерфейс для обслуживания, который я обертываю с помощью Aspect.Весенний аспект вокруг POST: доступ к HTTPRequest для поиска зарегистрированного пользователя

@Path("/rs-service/") 
public interface ServiceRSI 
{ 
    @Override 
    @POST 
    @Path("/lookupParam/") 
    @Produces(MediaType.APPLICATION_XML) 
    ParamValue getParamValue(GetParamValue request); 
} 

Тогда мой XML аспект ..

<aop:config> 
    <aop:aspect id="auditLoggingAspect" ref="auditLogging"> 
     <aop:pointcut id="aspectA" expression="execution(* com.ServiceRSI.*(..))" /> 
       <aop:around pointcut-ref="aspectA" method="logRequest" /> 
      /> 
    </aop:aspect> 
</aop:config> 

То, что я хочу/нужно сделать, это войти в аспекте, который был пользователь, который прошел проверку подлинности, чтобы сделать этот запрос. Я использую MessageDigest как часть моей аутентификации.

Обычно я получаю доступ к HTTPRequest, чтобы узнать пользователя, который был аутентифицирован при вызове, но в этом случае это не передается методу, поэтому я не могу перехватить это в аспекте.

Может ли кто-нибудь предложить способ получить доступ к аутентифицированному пользователю из одного аспекта вокруг вызова restufull?

Благодаря

ответ

1

Добавить в web.xml

<listener> 
    <listener-class> 
    org.springframework.web.context.request.RequestContextListener 
    </listener-class> 
</listener> 
<listener> 
    <listener-class> 
    org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 

В классе вы должны иметь доступ к нему ...

@Autowired 
    private HttpServletRequest context; 

Тогда некоторый код ... (в этом случае она извлекает его из Message Digest loggon)

private String getAuthenticationUser() 
    { 
    String authorization = context.getHeader("authorization"); 
    if (authorization.startsWith("Digest response")) { 
     String[] splits = authorization.split(","); 
     for (String split : splits) 
     { 
     String[] splitKeyValue = split.trim().split("="); 
     if(splitKeyValue[0].equalsIgnoreCase("username")) { 
      authorization = splitKeyValue[1]; 
      authorization = authorization.replace("\"", ""); 
      break; 
     } 
     } 
    } 
    return authorization; 
    } 
1

Если вы можете получить доступ к информации, необходимой из HttpServletRequest, то вы могли бы использовать RequestContextHolder весны, чтобы получить доступ к этой информации.

ServletRequestAttributes t = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); 
HttpServletRequest req = t.getRequest(); 

Помогает ли это?