2013-12-23 1 views
3

Я в настоящее время осуществляет REST API с использованием Джерси (JAX-RS impelemntation) и некоторые части Spring.JAX-RS и Spring Security - получение подлинности пользователя

Я уже реализован без гражданства аутентификации с Spring Security с помощью настраиваемого фильтра и пользовательских AuthenticationEntryPoint, проблема в том, как я могу получить текущий пользователь в моем JAX-RS классов.

Я знаю, что в Spring MVC можно вводить Principal объект в методы контроллера, но как насчет JAX-RS классов? Я хочу, чтобы не загрязнять мои классы SecurityContextHolder.getContext().getAuthentication().

Один из способов - создать пользовательский класс, который будет адаптером для этого статического вызова, и ввести его в каждый класс обслуживания, в котором я нуждаюсь, или, возможно, этот вид адаптера уже открыт в Spring Security? Помимо моего предложения, есть ли какой-то «лучший» способ получить зарегистрированного пользователя в моей ситуации?

ответ

1

С JAX-RS вы, вероятно, захотите определить способ creating custom entities, который может быть введен с помощью @Context. К сожалению, спецификация JAX-RS не указала, как это сделать, но ее реализации. Например, CXF (который хорошо работает с весной) будет делать это следующим образом:

public class AuthenticationContextProvider implements ContextProvider<Authentication> { 
    public Authentication createContext(Message message) { 
     return SecurityContextHolder.getContext().getAuthentication(); 
    } 
} 

Вы бы тогда должны зарегистрировать этот поставщик, который затем позволит вам сделать:

@GET 
@Path("/{id}") 
@Produces("text/plain") 
public String demonstration(@PathParam("id") String id, 
     @Context UriInfo ui, @Context Authentication auth) { 
    // ... 

Вы можете сделать что-то подобное с Джерси (как указано выше связанный вопрос), но я не знаю, Джерси почти так хорошо.

+0

Я почти соблазн уйти и реализовать это в своем собственном коде теперь, когда я посмотрел, как это сделать. За исключением моего рождественского перерыва ... –

-1

Вы можете ввести HttpServletRequest с помощью аннотации @Context. Это работает как для параметров методов JAX-RS Resource, так и для полей ресурсов JAX-RS. Может быть, это может вам помочь?

Смежные вопросы