В 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";
}
}