2016-06-09 4 views
0

Я использую Spring Boot с Spring Security.Добавить роль в метод

Чтобы создать нового пользователя, «создающий» пользователь должен быть администратором.

Но если «создать» пользователь имеет только стандартную роль ...

@PreAuthorize("hasRole('admin')") 
@RequestMapping(value = "/users", method = RequestMethod.POST) 
public Long createUser(@RequestBody @Valid final UserAppDto user) { 
    return userService.save(user); 
} 

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

В моем UserApp классе, для роли, у меня есть:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private Set<Role> roles = new HashSet<>(); 

Моей главной заявка

@EntityScan(basePackageClasses = {Application.class, Jsr310JpaConverters.class}) 
@SpringBootApplication 
@EnableCaching 
@EnableScheduling 
public class Application implements SchedulingConfigurer{ 

    @Bean 
    public WebSecurityConfigurerAdapter webSecurityConfigurerAdapter() { 
     return new ApplicationSecurity(); 
    } 

} 

@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
public class ApplicationSecurity extends WebSecurityConfigurerAdapter { 
} 

ответ

1

Не следует использовать предварительно пост аннотаций на контрольных приборах. Они используют AOP под капотом, поэтому они не работают на контроллерах, если они не реализуют интерфейсы, или если вы не используете proxy-target-class = true, которые могут иметь другие недостатки (*).

Эти аннотации следует использовать для сервисов, поскольку сервисные компоненты в интерфейсах обычно связаны друг с другом, поэтому механизмы АОП будут работать должным образом.

Пружинный способ ограничения доступа к URL-адресу осуществляется через http-безопасность, а не через защиту метода.

(*), в частности, никогда не смешивать класса проксирование и JDK проксирование в одном приложении ...

+0

нормально по безопасности HTTP, вы имеете в виду что-то вроде http.authorizeRequests(). AntMatchers ("/ **"). hasRole ("ПОЛЬЗОВАТЕЛЬ")? это то же самое с @Secured и @RolesAllowed? –

+1

@robertgagnon: Да по http security, я имею в виду 'http.authorizeRequests() ...'. Это используется механизмом фильтра пружинных фильтров до того, как запрос попадет на передний контроллер DispatcherServlet и не зависит от АОП в отличие от аннотаций @ @ Secured или pre-post. –

+0

ok попробует это –

Смежные вопросы