Spring Security: безопасность на уровне метода, предотвращающая доступ к роли - PullRequest
1 голос
/ 25 октября 2019

Используя Spring Security 5.2.X (последняя версия в настоящее время), мне нужно запретить доступ к сторонней роли для всех методов, кроме одного в службе SOAP. Другими словами, мне нужна эта конкретная роль, чтобы иметь доступ только к одному конкретному методу из всех доступных в сервисе.

Обычно обычная секьюризация на уровне метода состоит из аннотации с @Secure("MY_ROLE"). Это делает метод доступным только для этой роли.

Можно ли сказать Spring Security Core сделать обратное. Т.е. настройте его так, чтобы определенный пользователь имел доступ только к защищенному методу.

Конечно, обходной путь может быть таким:

// Method accessible by anyone but third party role
@Secured({"GOOD_ROLE1", "GOOD_ROLE2", "GOOD_ROLE3"})
public void methodAccessibleByAnyoneButThirdPartyRole(){
}

// Method accessible by anyone, including third party role
@Secured({"GOOD_ROLE1", "GOOD_ROLE2", "GOOD_ROLE3", "THIRD_PARTY_ROLE"})
public void methodAccessibleByAnyone(){
}

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

Но есть ли вариант аннотации, чтобы получить тот же сразу? Что-то вроде @PreAuthorize("!hasRole('THIRD_PARTY_ROLE')") или подобное?

1 Ответ

3 голосов
/ 25 октября 2019

Согласно Spring Security doc вы можете использовать любой язык выражений Spring (SpEL) в @PreAuthorize

Любые функциональные возможности Spring-EL доступны в выражении, поэтому вы можетеможет также получить доступ к свойствам аргументов. Например, если вы хотите, чтобы конкретный метод разрешал доступ только пользователю, чье имя совпадает с именем контакта, вы можете написать

@ PreAuthorize ("# contact.name == authentication.name")
public void doSomething (контактный контакт);

Так что вы можете использовать:

@PreAuthorize("!hasRole('THIRD_PARTY_ROLE')")

Также как более читаемый вариант:

@PreAuthorize("not hasRole('THIRD_PARTY_ROLE')")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...