Spring Security: разрешить пользователю доступ только к своей странице администрирования - PullRequest
3 голосов
/ 29 июля 2011

В моем веб-приложении пользователи могут изменять свои данные пользователя. URL этой страницы:

springproject/usermanagement/edituserinfo/4

где "4" - идентификатор пользователя.

Мой контекст безопасности выглядит так:

<security:http auto-config="true" use-expressions="true">
    <security:intercept-url pattern="/usermanagement" access="isAuthenticated()" />
    <security:intercept-url pattern="/usermanagement/new" access="hasRole('ROLE_ADMIN')" />
    <security:intercept-url pattern="/usermanagement/edit/*" access="hasRole('ROLE_ADMIN')" />
    <security:intercept-url pattern="/usermanagement/edituserinfo/*" access="isAuthenticated()" />  
</security:http>

Как я могу ограничить пользователя только доступом к его собственной странице "edituserinfo"? Например. пользователь с идентификатором пользователя 1 может иметь доступ только к «springproject / usermanagement / edituserinfo / 1», но не к «springproject / usermanagement / edituserinfo / 4»

Ответы [ 2 ]

6 голосов
/ 31 июля 2011

Используйте PathVariable в URL-адресе, например @RequestMapping("/usermanagement/edituserinfo/{userid}"), и в своем коде проверьте правильность принципа контекста Spring Security вошедшего в систему пользователя (через SecurityContextHolder.getContext().getAuthentication().getPrincipal()) по отношению к переменной пути userid.Если они не совпадают, отпустите пользователя, войдите в систему SecurityException и отправьте электронное письмо администраторам.

4 голосов
/ 02 апреля 2015

Вы также можете сделать это, используя @PreAuthorize Spring Security, который поддерживает выражения:

@PreAuthorize("#userId == principal.id")
public void doSomething(@PathVariable String userId);

См. Документы Spring:

Контроль доступа с использованием @PreAuthorize и @ PostAuthorize

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