Безопасный доступ к контроллеру в Spring MVC - PullRequest
0 голосов
/ 20 июня 2019

В моем приложении мне нужно защитить доступ к контроллеру с помощью Spring Security

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

Вот пример контроллера:

@Controller
@RequestMapping("${path.myapp}" + "/accounts")
public class AccountsController extends AbstractCrudController<AccountsBean, Long> {
...
}

В моем приложении у каждого пользователя есть список функций (определенный в таблице БД, которая связывает USER-> FUNCTIONALITY). Пользователь также имеет роль, но пользователи с одинаковыми ролями могут использовать различные функции.

Когда приложение запускается и пользователь входит в систему, я читаю все функции, связанные с пользователем, и правильно отображаю / скрываю пункты меню.

Вот куча JSP:

<sec:authorize access="hasAnyRole('Anagrafica -> Accounts')" > 
                                <li id="accounts"><a href="${anagraficaPath}/accounts/index.html"><fmt:message key="menu.anagrafica.accounts"/></a></li>
                                <li class="divider"></li>
                                </sec:authorize>

Как я могу защитить этот контроллер, чтобы запретить пользователям, у которых нет функции 'Anagrafica -> Учетные записи'?

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Поскольку вы хотите защитить конкретный контроллер, вам нужно использовать аннотацию @PreAuthorize чуть выше него, как показано ниже:

@PreAuthorize("hasAuthority('"Anagrafica -> Accounts"')")
public ResponseEntity<T> getAll(){}

ИЛИ

@PreAuthorize("hasRole('"Anagrafica -> Accounts"')")
public ResponseEntity<T> getAll(){}

Примечание:@PreAuthorize аннотация это уровень метода, а не класса, потому что PreAuthorize содержит @Target({ ElementType.METHOD, ElementType.TYPE }).

0 голосов
/ 21 июня 2019

Вы можете защитить URI в своем классе конфигурации безопасности, который расширяет WebSecurityConfigurerAdapter https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#oauth2login-provide-websecurityconfigureradapter

, например

Configuration
@EnableWebSecurity
public class MySecConfig extends WebSecurityConfigurerAdapter {

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests().mvcMatchers("${anagraficaPath}/accounts/*")
            .hasAnyRole("'Anagrafica -> Accounts'");

Затем вы даже можете изменить свой тег на: Затем он также будет использовать то же правило, которое вы определили в своем классе конфигурации.

Также, если вы можете включить аннотации на уровне методов и методы в контроллере, вы можете использовать PreAuthorize, например.

@PreAuthorize("hasRole('Anagrafica -> Accounts')")
public void myControllerMethod() {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...