Spring Security and Multitenancy / REST -> Как?Лучшая практика?Справочное приложение? - PullRequest
1 голос
/ 25 июля 2010

Я искал способ защитить URL-адреса, такие как

@RequestMapping("/owners/{ownerId}/pets/new")

на уровне пользователя (не роли), то есть только владелец с идентификатором {ownerId} имеет доступ.Более того, я хочу обеспечить RESTful дизайн вкл.асинхронный доступ к службам JSON на уровне владельца динамически .

Мои вопросы:

  1. Как это лучше всего сделать с помощью Spring Security?
  2. Как это сделать, когда / owners / {ownerId} / pets / new доступен через асинхронный запрос?
  3. Как получить доступ к вышеупомянутому URI из стороннего приложения, например приложения iPhone?
  4. Какие-либо образцы / справочные приложения / статьи?

Спасибо Er

Ответы [ 2 ]

2 голосов
/ 26 июля 2010

Использовать @ PreAuthorize .Вы можете использовать выражение Spring-EL, например

@RequestMapping("/owners/{ownerId}/pets/new")
@PreAuthorize("#ownerId == principal.id)")
public void doSomething(@RequestParam Number ownerId);

Приведенный выше код является только представительным.Некоторые детали зависят от вашей реализации.

Подробнее здесь .

1 голос
/ 25 июля 2010

Относительно вашего вопроса 1, самый простой подход, который я могу придумать, - в вашем методе контроллера вы можете сначала проверить авторизацию пользователя на основе идентификатора.UserDetails доступен из SpringSecurityContext, и вы можете извлечь из него идентификатор пользователя, вошедшего в данный момент в систему.Идентификатор, полученный из URL-адреса запроса, также доступен в качестве переменной пути.Если эти два значения не совпадают, вы можете просто вызвать исключение, например AccessDeniedException.Вы можете переместить эту логику в метод в BaseController, который будет действовать как суперкласс для всех ваших контроллеров, и один и тот же метод может использоваться всеми методами контроллера для аналогичной проверки.

...