我有一个基本的REST控制器,它提供了一般方法(GET,PUT,POST,DELETE)。
然后特定控制器继承这些方法并使用它们或覆盖它们。当这样的子类控制器覆盖继承的控制器方法时,我有时需要添加例如@PreAuthorize("hasAnyRole('ROLE_ADMIN')")
来限制对某些安全角色的访问。
但是,现在我有另一个子类控制器,我只需要允许访问GET继承的方法。绝对禁止所有其他继承的方法(PUT,POST,DELETE)。
我尝试使用空@PreAuthorize
覆盖DELETE:
@PreAuthorize
@Override
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
@ResponseBody
public void removeResource(@PathVariable("id") final Long id, final Principal principal) throws UnknownResourceException {
// Deny access to everyone
}
但是,没有值,它不是有效的注释。
是否有解决此问题的通常模式?
答案 0 :(得分:0)
Spring建议使用HttpSecurity保护您的Mapping Handler:
在实践中,我们建议您在服务中使用方法安全性 图层,用于控制对应用程序的访问,并且不完全依赖 关于在web应用程序中定义的安全性约束的使用 水平。网址发生变化,很难将其全部考虑在内 应用程序可能支持的可能URL以及请求的可能方式 被操纵。你应该试着限制自己使用一些 简单的蚂蚁路径,易于理解。总是尝试使用 一个"拒绝按默认"你有一个全能通配符的方法(/ ** 或**)最后定义并拒绝访问。
因此,例如,它使用URL安全性进行保护,并且可以通过Http方法区分:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
// ...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().and()
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/myurl").hasRole("ADMIN")
.antMatchers(HttpMethod.GET, "/myurl/**").hasRole("USER")
.antMatchers(HttpMethod.DELETE, "/myurl/**").hasRole("ADMIN")
.antMatchers(HttpMethod.PUT, "/myurl/**").hasRole("USER");
}
// ...
}