zoukankan      html  css  js  c++  java
  • nginx 请求文件 进行用户认证/鉴权: internal(限制为内部调用)

      在进行WEB开发时, 必然会遇到向用户返回文件的场景(如图片, 文档等等), 当返回的文件较小时, 我们可以直接通过接口以数据流的形式向前台返回, 因为文件较小, 因此也不会太过于影响响应速度及服务器性能, 但是当文件较大时, 再使用接口中返回数据流的方式就显得极其不合适了. 此时, 就需要通过 nginx 读取文件资源向用户进行返回.

      但是, 如果当用户进行文件请求时, 我们需要对用户进行身份认证(如视频VIP会员, 文档保密需求, 图片防盗用等等), 这时我们就需要对 nginx 进行配置, 限制任意用户进行访问目标文件, 将其设置仅限内部调用.

      当用户发起文件请求:

            第一步, 先将用户的请求导向web应用层, 并进行用户身份的认证

            第二步, 认证通过, 在web应用层发起内部调用, 由nginx返回文件, 否则返回 403

    一.nginx 配置

      在 location 中加入 "internal", 声明仅限内部调用

    location /nodeOne/auth/ {
      internal; root
    /var/resource/media/; }

    二.web应用层进行用户认证, 并发起内部调用: 以 python django 为例

    """具体的用户认证流程须根据具体需求进行开发, 这里不列出"""

    resp = HttpResponse()

    file_name = path[path.rfind("/") + 1:]

    # 其他响应头根据需求进行添加, 但是 X-Accel-Redirect 这个响应头必须设置, 它的值就是文件的url, 也就是需要和 nginx 中 location 相匹配. 其实就是声明将本次请求进行一次内部调用的重定向
    resp['X-Accel-Redirect'] = "/nodeOne/auth/" + file_name

    resp["Content-Disposition"] = "attachment; filename={}; md5_token={}".format(parse.quote(file_name), query_set[0].file_md5)
    resp['Content-Type'] = 'application/{}'.format(path[path.rfind(".")+1:])
    resp["Content-Length"] = query_set[0].file_size * 1024
    return resp

      需要注意的是, 当向用户返回文件的url时, 并不应该直接返回真实的文件url, 因为nginx中设置了仅限内部调用, 如果由外部直接发起文件请求, 将得到 nginx 返回的 404 响应,  所以返回给用户的url, 应该是进行用户认证的接口, 至于如何携带参数, 用以判断用户请求的是哪个文件资源, 就需要开发者自行斟酌了.

  • 相关阅读:
    观察者模式(Observer)
    怎样解决Java Web项目更改项目名后报错
    MAVEN最佳实践:模块划分
    java.lang.OutOfMemoryError: PermGen space及其解决方法
    以Windows服务方式启动MySQL,并将其默认编码设置为UTF-8
    ubuntu 12.04和Windows 7双系统的安装方法
    允许ubuntu下mysql远程连接
    Linux 系统目录介绍
    SVN中图标符号的含义
    简单介绍Linux下安装Tomcat的步骤
  • 原文地址:https://www.cnblogs.com/lowmanisbusy/p/11718345.html
Copyright © 2011-2022 走看看