【问题标题】:SpringBoot Rest API custom authenticationSpring Boot Rest API 自定义身份验证
【发布时间】:2017-03-17 09:23:42
【问题描述】:

我使用 SpringBoot 构建了一个 Rest Api,并使用 Firebase 实现了身份验证。

我现在的问题是我想控制将访问我的应用程序的客户端应用程序。使用 SpringSecurity 的问题在于,据我所知,我必须对其进行身份验证,而我只想“允许客户端应用程序”。

有人知道怎么做吗?

【问题讨论】:

  • 您的意思是您不想为某组客户端执行身份验证?
  • 不要。所有客户端都必须经过身份验证,但此任务将是 Firebase。在我的服务器上,我将检查应用程序是否被授权访问服务器。我的问题是精确验证应用程序。

标签: spring rest spring-boot


【解决方案1】:

为您的客户提供唯一的密钥。您的微服务根据该密钥识别和验证任何请求。这也可以作为request parameter 给出。

假设您将密钥添加到名为 my-key 的参数中,现在在您的 spring-boot 应用程序中处理您的逻辑之前验证您的密钥。像这样 -

你的 Rest Controller 看起来像这样-

@RestController
class MyRest{

    private static final String KEY = "someValue";

    @RequestMapping("/some-mapping")
    public @ResponseBody myMethod(@RequestParam(value="my-key", required=true) String key){
        if(!validateRequest(key)){
            //return error as response
        }
        System.out.println("Key Validation Successful!");
        //here goes your logic
    }

    private boolean validateRequest(String key){
        return key.equals(KEY);
    }
}

为了访问这个休息使用 - http://your-host:port/some-mapping?my-key=someValue

【讨论】:

  • 但是我会在哪里以及如何在 Spring 中检查密钥?
  • 这样,任何人都可以访问 API。更好的方法是在 POST 中发送数据。但是同样,如果客户端可以发送“密钥”,它可以很容易地使用正常的身份验证机制。
  • @yasin - 这只是展示用户可以尝试的内容。其他修改由他决定:)
  • 非常感谢您的回复。为了改进一点,将实现一个过滤器,它将过滤所有请求并验证密钥。你怎么看?
  • 听起来不错:)
【解决方案2】:

如果您希望允许某些客户端绕过身份验证,请列出列入白名单的 IP 地址并检查每个传入请求的 IP。如果 IP 在白名单 API 列表中,则无需进行身份验证。

使用HttpServletRequest.getRemoteAddr()获取IP地址。

【讨论】:

    【解决方案3】:

    解决方案 1

    自定义拦截器MyHandlerInterceptor.java:

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class MyHandlerInterceptor implements HandlerInterceptor {
        private static final String YOUR_KEY = "KEY_VALUE";
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
            String key = request.getHeader("X-Key");
            boolean isValid = YOUR_KEY.equals(key);
            if (!isValid) {
                //invalid key
                response.setStatus(401);
                PrintWriter writer = response.getWriter();
                writer.write("invalid key");
            }
            return isValid;
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        }
    }
    

    配置拦截器WebConfig.java:

    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new MyHandlerInterceptor());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 2020-12-05
      • 2017-04-09
      • 2021-04-21
      • 2018-10-07
      • 2020-05-22
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多