2016-12-25 2 views
1

У меня есть веб-служба Spring, где пользователи имеют доступ только к определенным ресурсам. Любой пользователь может сделать запрос на получение информации о ресурсе, но мне нужно выбросить исключение авторизации, если у них нет доступа к этому ресурсу. API выглядит следующим образом:Spring Security Authorization

GET /resources/{resourceId} 

Приведенный выше API предоставляет пользователю всю информацию о данном ресурсе.

В настоящее время я выполняю аутентификацию с использованием WebSecurityConfigurerAdapter. Чтобы добавить авторизацию, я заметил, что я могу установить предоставленные полномочия как часть объекта проверки подлинности. При этом я могу использовать что-то вроде @PreAuthorize("hasRole('ROLE_USER')") для выполнения авторизации.

Однако для упомянутого API я не уверен, что упомянутый подход авторизации подходит по следующим причинам.

  1. Я авторизуюсь на основании того, имеет ли пользователь права доступа к конкретному resourceId. Это не совсем определенная роль. Больше похоже на Привилегию. Можно ли использовать hasRole() для этого варианта использования?
  2. Если бы я использовал аннотацию hasRole(), мне нужно было бы сделать что-то вроде @PreAuthorize("hasRole('ACCESS_RESOURCEID12346')"), где RESOURCEID12346 - resourceId. Но у нас есть только доступ к resourceId, когда мы находимся в контроллере API. Итак, как я могу использовать это значение для аннотации авторизации?

Если указанный подход не является наилучшим способом решения проблемы, я был бы признателен за любые комментарии/комментарии о том, каким будет наилучший подход. Я бы хотел избежать этой проверки в контроллере. Я пытаюсь сделать это с помощью Spring Security, аналогично тому, как работает @PreAuthorize. Я думаю, что доступ к resourceId является требованием авторизации, и мы не должны даже попасть в контроллер API, если у пользователя нет доступа к этому ресурсу.

+0

У вас есть информация о пользователе, поэтому я бы предоставил таблицу UserResouce в db и проверить отношения на get. – ChiefTwoPencils

+0

1. Разве это не будет сочетать аутентификацию и авторизацию? Из моего понимания по дизайну лучше отделить аутентификацию и авторизацию. 2. Как получить доступ к ресурсу? Мне нужно проверить?Это зависит только от пути API. – AndroidDev93

+0

Я не вижу, как это будет сочетаться. У вас есть auth через preauth на ROLE_USER? Итак, вы уже авторизованы, и у вас есть путь и идентификатор. Итак, сделав предположения, вы можете сделать 'getResourceByUserAndResourceId (...)', где запрос использует таблицу, упомянутую выше. – ChiefTwoPencils

ответ

2

Распределение разрешений через роли, связанные с идентификатором ресурса, похоже на потенциальный кошмар обслуживания. Если вы не хотите разрешать доступ к контроллеру, то, возможно, access - лучшая вещь для использования.

В приведенной выше ссылке приведены примеры как для конфигурации на основе Java, так и для xml и показано, как вы можете получить доступ к пути до входа в контроллер.

Вы бы обеспечить метод, который вы ссылаетесь, как:

boolean checkResourceAccess(Principal principal, int resourceId)

В вашей конфигурации вы ссылаетесь на URL-адрес аргумента как #resourceId отображение его на {resourceId}.

Java конфигурации Пример:

http.authorizeRequests() 
    .antMatchers("/resources/{resourceId}") 
    .access("@yourBean.checkResourceAccess(principal,#resourceId)")... 

В этом методе вы поставляете любую логику, необходимые для определения прав доступа пользователя.

+0

Этот подход лучше, чем наличие GrantedAuthority для этого ресурса при аутентификации, а затем с помощью @PreAuthorize («hasAuthority» («ACCESS_ # resourceId») » – AndroidDev93

+1

Я считаю, что« лучше »субъективно, но я бы так подумал. Вы прочитали принятый ответ [здесь] (http://stackoverflow.com/questions/19525380/difference-between-role-and-grantedauthority-in-spring-security)? – ChiefTwoPencils

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