如何使用Spring保护REST web服务,删除是可能的,尽管我不知道';它不是作者写的

如何使用Spring保护REST web服务,删除是可能的,尽管我不知道';它不是作者写的,spring,spring-security,Spring,Spring Security,我正在Spring中设置一个安全配置,我希望只有用户可以访问我在配置中编写的资源。如果我没有编写DELETE我不希望任何用户可以使用此请求,例如, 这是最严格的限制,除非我加上它。我应该在代码上更改什么 我编写了下一个代码GET和POST可以,但我可以删除,不添加此授权 @配置 @启用Web安全性 @EnableGlobalMethodSecurity(Prespenabled=true) 公共类SecurityJavaConfig扩展WebSecurity配置适配器{ @凌驾 受保护的无效配置

我正在Spring中设置一个安全配置,我希望只有用户可以访问我在配置中编写的资源。如果我没有编写
DELETE
我不希望任何用户可以使用此请求,例如, 这是最严格的限制,除非我加上它。我应该在代码上更改什么

我编写了下一个代码
GET
POST
可以,但我可以删除,不添加此授权

@配置
@启用Web安全性
@EnableGlobalMethodSecurity(Prespenabled=true)
公共类SecurityJavaConfig扩展WebSecurity配置适配器{
@凌驾
受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{
认证
.inMemoryAuthentication()
.withUser(“用户”)
.password(编码器().encode(“passExample”))
.角色(“用户”);
}
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http
.httpBasic()
.及()
.csrf()
.disable()
.授权请求()
.antMatchers(HttpMethod.GET,“/**”).hasRole(“用户”)
.antMatchers(HttpMethod.POST,“/**”).hasRole(“用户”)
.及()
.formLogin()
.permitAll();
....
我希望如果我使用
DELETE
发出请求,应用程序将不允许,因为我没有授权它

curl -X Delete locahost/servicio/1

但实际输出为状态204。服务器已成功处理该请求。

您配置的是任何
GET
POST
对任何端点的请求都应具有用户角色
role\u user
,并预处理所有其他类型的请求,如(
DELETE
HEAD
PUT
)等)。尝试拒绝所有其他类型的请求

.antMatchers(“/**”).denyAll();
.anyRequest().denyAll();


请注意,这里的顺序很重要。如果您在
GET
POST
请求之前指定此项,则所有请求都将被拒绝。

您必须限制任何其他请求,请参阅:

6.4授权请求

我们的示例只要求对用户进行身份验证,并且已经对应用程序中的每个URL进行了身份验证。我们可以通过向http.authorizeRequests()方法添加多个子项来指定URL的自定义要求。例如:

protectedvoid配置(HttpSecurity http)引发异常{
http
.authorized请求()1
.antMatchers(“/resources/**”,“/signup”,““/about”).permitAll()2
.antMatchers(“/admin/**”).hasRole(“admin”)3
.antMatchers(“/db/**”).access(“hasRole('ADMIN')和hasRole('DBA'))4
.anyRequest().authenticated()5
.及()
// ...
.formLogin();
}
  • http.authorizeRequests()方法有多个子项,每个匹配器都按声明顺序考虑

  • 我们指定了多个URL模式,任何用户都可以访问。特别是,如果URL以“/resources/”、等于“/signup”或等于“/about”开头,则任何用户都可以访问请求

  • 任何以“/admin/”开头的URL都将被限制为具有“role\u admin”角色的用户。您会注意到,由于我们调用的是hasRole方法,因此不需要指定“role\u”前缀

  • 任何以“/db/”开头的URL都要求用户同时具有“ROLE\u ADMIN”和“ROLE\u DBA”。您会注意到,由于我们使用的是hasRole表达式,因此不需要指定“ROLE\u”前缀

  • 任何尚未匹配的URL只需要对用户进行身份验证

  • 请参阅:

    denyAll

    public ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry denyAll()
    
    指定任何人都不允许URL

    您修改的代码:

    @覆盖
    受保护的无效配置(HttpSecurity http)引发异常{
    http
    .httpBasic()
    .及()
    .csrf()
    .disable()
    .授权请求()
    .antMatchers(HttpMethod.GET,“/**”).hasRole(“用户”)
    .antMatchers(HttpMethod.POST,“/**”).hasRole(“用户”)
    .anyRequest().denyAll()
    .及()
    .formLogin()
    .permitAll();
    }
    
    public ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry denyAll()