将摇摇欲坠的webService的请求发送到401并未经授权

问题描述 投票:0回答:2

我是这个项目的新手,我接到了向该项目添加一些服务的任务。首先,我在其他Rest包旁边创建了一个包NCDM,并创建了我的课程NCDMMemberController

    package ir.anarestan.ipc.controller.NCDM;
    import ir.anarestan.ipc.controller.helper.NCDM.NCDMMemberDTO;
    import ir.anarestan.ipc.controller.helper.ResponseDTO;
    import ir.anarestan.ipc.service.NCDM.NCDMMemberService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpStatus;
    import org.springframework.mobile.device.Device;
    import org.springframework.web.bind.annotation.*;

    import java.util.List;


    @RestController
    @RequestMapping(path = "/ncdmMember")
    public class NCDMMemberController {

private final static Logger logger = LoggerFactory.getLogger(NCDMMemberController.class);

@Autowired
private NCDMMemberService ncdmMemberService;

@ResponseBody
@RequestMapping(value = "/getMember", method = RequestMethod.GET, produces = "application/hal+json")
public Object get(@RequestBody NCDMMemberDTO memberDTO, Device device) {
    ResponseDTO responseDTO = new ResponseDTO();
    try {
        responseDTO.setSuccess(true);
        responseDTO.setHttpStatus(HttpStatus.OK.value());
        responseDTO.setResponseBody(ncdmMemberService.getMemberByMemberIdAndImei(memberDTO));
        return responseDTO;
    } catch (Exception e) {
        logger.info("error occurred!", e);
        responseDTO.setSuccess(false);
        responseDTO.setErrorMessage(e.getMessage());
        responseDTO.setHttpStatus(HttpStatus.EXPECTATION_FAILED.value());
        responseDTO.setResponseBody(null);
        return responseDTO;
    }
}

@ResponseBody
@RequestMapping(value = "/saveMember", method = RequestMethod.POST, produces = "application/hal+json")
public Object save(@RequestBody NCDMMemberDTO member, Device device) {
    ResponseDTO responseDTO = new ResponseDTO();
    try {
        ncdmMemberService.saveMember(member);
        responseDTO.setSuccess(true);
        responseDTO.setHttpStatus(HttpStatus.OK.value());
        responseDTO.setResponseBody(null);
        return responseDTO;
    } catch (Exception e) {
        logger.info("error occurred!", e);
        responseDTO.setSuccess(false);
        responseDTO.setErrorMessage(e.getMessage());
        responseDTO.setHttpStatus(HttpStatus.EXPECTATION_FAILED.value());
        responseDTO.setResponseBody(null);
        return responseDTO;
    }
}
}

但是当我尝试从招摇发送请求时,收到以下响应:

{
  "timestamp": 1579957861338,
  "status": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "path": "/ncdmMember/saveMember"
}

并且当对先前服务的sendig请求没有错误时,就会发生这种情况。有人知道这是什么问题吗?我需要在某个地方介绍我的包/类吗?

当我将其中一项书面服务复制到私人班级时,一切都很好。

任何帮助将不胜感激。

java spring-boot web-services swagger spring-restcontroller
2个回答
1
投票

这是因为,您已经在项目中设置了Spring Security。根据身份验证的类型(OAuth2Basic AuthDigest Auth等),您需要在定义为SwaggerConfiguration的Docket bean中添加securityScheme。

示例:

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2).
    ... // more configurations
    .securitySchemes(/*List of Your SecuritySchemes*/)
    .build();

然后您可以使用Swagger文档的Authorize

按钮。以下是OAuth2的示例

enter image description here

enter image description here


0
投票

经过一些研究,当然还有答案给出的线索,我发现我的问题来自SpringSecurity,而我唯一需要做的就是将控制器类的基本URL添加到WebSecurityConfig作为允许的URL。如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.