Как расширить @Preauthorize Spring Security с помощью пользовательского правила проверки? - PullRequest
0 голосов
/ 30 ноября 2018

Spring Security предоставляет некоторые удобные аннотации управления методом:

@PreAuthorize("hasRole('ADMIN')")
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@PreAuthorize("hasPermission('ADD')")

Я хочу расширить его с помощью некоторого пользовательского метода, такого как

 @PreAuthorize("hasCompany('XX')") 

, и его данные проверки должны поступать из JWTтокен.

Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Есть несколько способов сделать это, но то, что упомянул @Andrew, будет проще.Просто отметив, что вы сказали, что хотите проверить, имеет ли ваш токен JWT определенную компанию "XX", тогда это будет

@PreAuthorize("@yourBeanName.customMethod(authentication)")

и внутри вашего экземпляра yourBeanName вам нужно реализоватьметод извлечения информации о компании из нее и сравнения этих двух,

Или, возможно, вы можете сделать что-то вроде

@PreAuthorize("#oauth2.hasCompany('XX')")

так же, как и обычный SpringELoauth2 токен доступа.

Чтобы сделать это,

  1. вам необходимо реализовать свой собственный DefaultMethodSecurityExpressionHandler (проверьте для сравнения OAuth2MethodSecurityExpressionHandler)
  2. , и когда вы реализуете метод createEvaluationContextInternal (), вам потребуется новыйОбработчик выражений OAuth2, а не OAuth2SecurityExpressionMethods, поскольку у него нет пользовательского метода hasCompany ().Просто создайте новый класс, который расширяет OAuth2SecurityExpressionMethods, добавьте метод hasCompany () и вставьте его в новый DefaultMethodSecurityExpressionHandler.
0 голосов
/ 30 ноября 2018

Вы можете создать метод в реализации пользовательского компонента @PreAuthorize("@yourBeanName.customMethod(authentication.principal.username)")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...