Spring Security позволяет каждому пользователю видеть свой собственный профиль, но не более - PullRequest
0 голосов
/ 11 октября 2018

В Spring MVC с Spring Security можно ли этого добиться?

@ Переопределить WebSecurityConfigurerAdapter.configure (HttpSecurity)

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http
            .authorizeRequests()
            .mvcMatchers("/users/{authentication.principal.username}").hasAnyRole(ADMIN, MANAGER)
            .antMatchers("/users/**").hasRole(ADMIN)
            .anyRequest().authorized()
    ...
}

/users/** isзапретная зона и должна быть доступна только администраторам.Но менеджеры по-прежнему должны видеть свой собственный профиль (/users/user_with_manager_role) и только свой собственный профиль, а не профиль других пользователей (независимо от их роли).

Решение

Я нашел решение в ответе Эндрю.Мой код теперь выглядит следующим образом:

WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) // added this annotation
public class SecurityConfig extends WebSecurityConfigurerAdapter

@ Override WebSecurityConfigurerAdapter.configure (HttpSecurity)

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http
            .authorizeRequests()
            // removed /users handling
            .anyRequest().authorized()
    ...
}

UsersController

@Controller
@RequestMapping("/users")
public class UsersController
{
    @GetMapping("{username}")
    @PreAuthorize("authentication.principal.username == #username) || hasRole('ADMIN')")
    public String usersGet(@PathVariable("username") String username)
    {
        // do something with username, for example get a User object from a JPA repository
        return "user";
    }
}

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Примерно так:

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http
            .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/myself").hasAnyRole(ADMIN, MANAGER)
            .antMatchers("/users/**").hasRole(ADMIN)
            .anyRequest().hasAnyRole(ADMIN, MANAGER)
    ...
}

@RequestMapping(value = "/myself", method = RequestMethod.GET)
public Profile getMyself() {
    // return the profile of the loged in user
}

С помощью этого менеджера и администраторов можно получить собственный профиль, а администраторы могут также запрашивать другие профили с помощью /users/{username}.

.
0 голосов
/ 11 октября 2018

Боюсь, что это невозможно: при настройке этой конфигурации у нее нет информации о {authentication.principal.username}, которая будет решена в какой-то момент в будущем.

Но Spring дает вам кучувстроенные выражения безопасности метода вы можете аннотировать свои методы с помощью.

Начиная с простого выражения, например @PreAuthorize("hasRole('ADMIN')"), вы можете получить собственное:

@XMapping(path = "/users/{username}")
@PreAuthorize("@yourSecurityService.isMyPage(authentication.principal, #username)")
public void yourControllerMethod(@PathVariable String username);

@yourSecurityService.isMyPage(authentication.principal, #username) относится к вашему @Service методу public boolean isMyPage(Principal, String).

...