首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用@WithMockUser的Rest保证测试适用于GET请求,但不适用于POST (403错误)

使用@WithMockUser注解可以在测试中模拟一个已认证的用户,以便进行权限相关的测试。该注解可以用于GET请求的测试,但对于POST请求可能会导致403错误。

403错误表示服务器理解请求,但拒绝执行它,通常是由于权限不足引起的。在使用@WithMockUser注解时,它会模拟一个已认证的用户,但并不会模拟用户的权限。对于GET请求,由于通常不涉及修改数据或执行敏感操作,因此可以使用@WithMockUser进行测试。但对于POST请求,由于可能会修改数据或执行敏感操作,需要确保用户具有足够的权限才能执行。

为了解决POST请求中的403错误,可以采取以下几种方法:

  1. 使用@WithMockUser注解时,通过设置用户的权限来模拟具有足够权限的用户。可以在注解中使用authorities属性来指定用户的权限,例如:@WithMockUser(authorities = "ROLE_ADMIN")。
  2. 在测试方法中,使用Spring Security的MockMvcRequestBuilders工具类构建POST请求时,可以使用with(csrf())方法添加CSRF令牌,以确保请求是经过CSRF保护的。例如:
代码语言:txt
复制
import static org.springframework.security.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.security.test.web.servlet.request.MockMvcRequestBuilders.with;
import static org.springframework.security.test.web.servlet.response.MockMvcResultMatchers.status;

...

mockMvc.perform(post("/api/endpoint")
        .with(csrf())
        .contentType(MediaType.APPLICATION_JSON)
        .content(jsonPayload))
        .andExpect(status().isOk());
  1. 如果需要进行更复杂的权限测试,可以使用Spring Security的@WithMockUser和@WithUserDetails注解结合使用。@WithUserDetails注解可以指定一个已存在的用户,包括其权限信息。例如:
代码语言:txt
复制
@WithUserDetails(value = "admin", userDetailsServiceBeanName = "myUserDetailsService")
public void testPostRequestWithAdminUser() {
    // Perform POST request and assert the response
}

在上述示例中,"admin"是一个已存在的用户,通过userDetailsServiceBeanName属性指定了用户详情服务的Bean名称。

总结起来,使用@WithMockUser的Rest保证测试适用于GET请求,但对于POST请求可能会导致403错误。为了解决这个问题,可以通过设置用户的权限、添加CSRF令牌或结合使用@WithMockUser和@WithUserDetails注解来进行测试。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Django Rest Framewor

    200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务) 204 NO CONTENT - [DELETE]:用户删除数据成功。 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。 更多看这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html 状态码

    02

    HTTP协议

    200 OK:客户端请求成功 301 redirect:页面永久性移走,服务器进行重定向跳转; 302 redirect:页面暂时性移走,服务器进行重定向跳转,具有被劫持的安全风险; 400 BadRequest:由于客户端请求有语法错误,不能被服务器所理解; 401 Unauthonzed:请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用; 403 Forbidden:服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因,一般来说是服务器策略基于安全考虑拒绝提供访问; 404 NotFound:请求的资源不存在,例如,输入了错误的URL; 500 InternalServerError:服务器发生不可预期的错误,导致无法完成客户端的请求; 503 ServiceUnavailable:服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常;

    02
    领券