我使用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 {
}
答案 0 :(得分:1)
不要对控制者使用事后注释。他们在引擎盖下使用AOP,因此它们不适用于控制器,除非它们实现接口或除非你使用proxy-target-class = true,这可能有其他缺点(*)。
这个注释应该用在服务上,因为服务bean通常作为接口绑定在控制器中,因此AOP机器将按预期工作。
限制访问url的弹簧安全方式是通过http安全,而不是通过方法安全。
特别是(*),永远不要在同一个应用程序中混合类代理和JDK代理...