配置apache服务器的用户认证

2023-05-16

      经常上网的读者会遇到这种情况:访问一些网站的某些资源时,浏览器弹出一个对话框,要求输入用户名和密码来获取对资源的访问。这就是用户认证的一种技术。用户认证是保护网络系统资源的第一道防线,它控制着所有登录并检查访问用户的合法性,其目标是仅 让合法用户以合法的权限访问网络系统的资源。基本的用户认证技术是“用户名+密码”。

 

   Apache是目前流行的Web服务器,可运行在Linux、Unix、Windows等操作系统下,它可以很好地解决“用户名+密码”的认证问题。
    apache用户认证所需要的用户名和密码有两种不同的存贮方式:一种是文本文件;另一种是MSQL、Oracle、MySQL等数据库。

 

下面以Linux的Apache为例,就这两种存贮方式,分别介绍如何实现用户认证功能。

一,采用文本文件存储

  这种认证方式的基本思想是:Apache启动认证功能后,就可以在需要限制访问的目录下(其对应的子目录也会起作用)建立一个名为.htaccess 的文件,指定认证的配置命令。当用户第一次访问该目录的文件时,浏览器会显示一个对话框,要求输入用户名和密码,进行用户身份的确认。若是合法用户,则显示所访问的页面内容,此后访问该目录的每个页面,浏览器自动送出用户名和密码,不用再输入了,直到关闭浏览器为止。
    
      以下是实现的具体步骤:

      假设Apache已经编译、安装到了/usr/local/apache目录中。缺省情况下,编译Apache时自动加入mod_auth模块,
    利用此模块可以实现“用户名+密码”以文本文件为存储方式的认证功能。
    (通过下面的命令,可以查看apache是否已经安装指定的模块,/usr/local/apache/bin/apachectl -l )

  1.修改Apache的配置文件/usr/local/apache/conf/httpd.conf,对认证资源所在的目录设定配置命令。
      下例是对/data/home/tenfyguo/proj/soso/htdocs目录的配置,对对应的虚拟机配置增加下面的配置:

  <Directory /data/home/tenfyguo/proj/soso/htdocs>
     Options Indexes FollowSymLinks
     allowoverride authconfig #关键是增加这句
     order allow,deny
     allow from all
  </Directory>

  其中,allowoverride authconfig一行表示允许对/data/home/tenfyguo/proj/soso/htdocs目录下的文件进行用户认证。

  2.在限制访问的目录/data/home/tenfyguo/proj/soso/htdocs下建立一个文件.htaccess (其实是一个隐藏文件),其内容如下:

      AuthName "这里的文字会显示在浏览器弹出的提示登录窗口中"
      AuthType basic
      AuthUserFile /data/home/tenfyguo/proj/soso/valid.txt #这里放用户名和密码文件,不能放在可以下载的地方
      require valid-user

  说明:文件.htaccess中常用的配置命令有以下几个:

  1) AuthName命令:指定认证区域名称。区域名称是在提示要求认证的对话框中显示给用户的。
  2) AuthType命令:指定认证类型。在HTTP1.0中,只有一种认证类型:basic。在HTTP1.1中有几种认证类型,如:MD5。
  3) AuthUserFile命令:指定一个包含用户名和密码的文本文件,每行一对。
  4) AuthGroupFile命令:指定包含用户组清单和这些组的成员清单的文本文件。组的成员之间用空格分开,如:
     managers:user1 user2
  5) require命令:指定哪些用户或组才能被授权访问。如:
     require user user1 user2(只有用户user1和user2可以访问)
     requires groups managers (只有组managers中成员可以访问)
     require valid-user (在AuthUserFile指定的文件中任何用户都可以访问)

  3.利用Apache附带的程序htpasswd,生成包含用户名和密码的文本文件:/data/home/tenfyguo/proj/soso/valid.txt,
      每行内容格式为“用户名:密码”。

    #cd /usr/local/apache/bin
    #htpasswd -bc /data/home/tenfyguo/proj/soso/valid.txt user1 1234
    #htpasswd -b /data/home/tenfyguo/proj/soso/valid.txt user2 5678

    文本文件/data/home/tenfyguo/proj/soso/valid.txt含有两个用户:user1,口令为1234;user2,口令为5678。

打开该文本文件可以发现对应的密码已经加密存储
      注意,不要将此文本文件存放在Web文档的目录树中,以免被用户下载。

  欲了解htpasswd程序的帮助,请执行htpasswd -h。

      完成后,重启apache使得配置生效.
      /usr/local/apache/bin/apachectl restart
 
      当用户第一次打开浏览器请求:http://test.soso.com:13601/test/,此时浏览器会弹出提示框,让用户输入用户名和密码。转包查看apache的响应:
      (1)apache的响应返回:
 HTTP/1.1 401 Authorization Required
 Date: Thu, 27 Jan 2011 11:10:07 GMT
 Server: Apache/2.2.4 (Unix)
 WWW-Authenticate: Basic realm="test"
 Content-Length: 401
 Keep-Alive: timeout=5, max=100
 Connection: Keep-Alive
 Content-Type: text/html; charset=iso-8859-1

 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
 <html><head>
 <title>401 Authorization Required</title>
 </head><body>
 <h1>Authorization Required</h1>
 <p>This server could not verify that you
 are authorized to access the document
 requested.  Either you supplied the wrong
 credentials (e.g., bad password), or your
 browser doesn't understand how to supply
 the credentials required.</p>
 </body></html>

 

       可以看出,apache的返回的状态码是401, 对应的提示信息:Anthorization Required,并且返回一个很重要的响应头:
        WWW-Authenticate: Basic realm="test"
      
       (2)浏览器弹出提示框让用户输入用户名和密码,输入后浏览器发送如下:
 GET /test/ HTTP/1.1
 Host: test.soso.com:13601
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 Accept-Language: zh-cn,zh;q=0.5
 Accept-Encoding: gzip,deflate
 Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
 Keep-Alive: 115
 Connection: keep-alive
 If-Modified-Since: Fri, 12 Jun 2009 03:43:20 GMT
 Authorization: Basic dGVuZnlndW86dGVuZnlndW8=

 

 可以看到,此时浏览器发送请求中带上了请求头:
        Authorization: Basic dGVuZnlndW86dGVuZnlndW8=
 apache正是利用这个头信息进去权限验证的。


    当用户数量比较少时,这种方法对用户的认证是方便、省事的,维护工作也简单。但是在用户数量有数万人,甚至数十万人时,
      会在查找用户上花掉一定时间,从而降低服务器的效率。这种情形,应采用数据库方式。

 

二,采用数据库存储

   目前,Apache、PHP、MySQL三者是Linux下构建Web网站的最佳搭档,这三个软件都是免费软件。将三者结合起来,通过HTTP协议, 利用PHP和MySQL,实现Apache的用户认证功能。
   只有在PHP以Apache的模块方式来运行的时候才能进行用户认证。为此,在编译Apache时需要加入PHP模块一起编译。假设PHP作为Apache的模块,编译、安装Apache到/usr/local/apache目录,编译、 安装MySQL到/usr/local/mysql目录。然后进行下面的步骤:

  1.在MySQL中建立一个数据库member,在其中建立一个表users,用来存放合法用户的用户名和密码。

  1)用vi命令在/tmp目录建立一个SQL脚本文件auth.sql,内容为:
  drop datebase if exists member;
  create database member;
  use member;
  create table users (
     username char(20) not null,
     password char(20) not null,
  );

  insert into users values("user1",password("1234"));
  insert into users values("user2",password("5678"));

 

  2)启动MySQL客户程序mysql,执行上述SQL脚本文件auth.sql的命令,在表users中增加两个用户的记录。

  #mysql -u root -pmypwd < /tmp/auth.sql

 

  2.编写一个PHP脚本头文件auth.inc,程序内容为:
<?php
 /*
 “PHP_AUTH_USER”
 当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
 “PHP_AUTH_PW”
 当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
 “AUTH_TYPE”
 当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
 */

 

 function authenticate() {
  header("HTTP/1.0 401 Authorization Required");
  header("WWW-Authenticate: Basic realm='test'");
  echo "请输入认证的用户名和密码";
  exit;
 }

 

 function check_user() {
    if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
       //这里可以改成访问DB获取用户名和密码即可
       if($_SERVER['PHP_AUTH_USER']=='tenfyguo' && $_SERVER['PHP_AUTH_PW']=='tenfyguo'){
       return 0;
       }

    return -1;
    }

    return -1;

 }

 

 if(check_user() < 0 ){
    authenticate();
 }

 echo "验证正常";
 exit;
 ?>

 

  函数authenticate()的作用是利用函数header("WWW-Authenticate: Basic realm='test'"),向浏览器发送一个认证请求消息,
    使浏览器弹出一个用户名/密码的对话框。当用户输入用户名和密码后,包含此PHP脚本的URL将自动地被再次调用,
    将用户名、密码、认证类型分别存放到PHP的三个特殊变量:“PHP_AUTH_USER”、“PHP_AUTH_PW”、“AUTH_TYPE”,在PHP程序中可根据这三个变量值来判断是否合法用户。
    header()函数中,basic表示基本认证类型,realm的值表示认证区域名称。

 

  函数header("HTTP/1.0 401 Authorization Required")使浏览器用户在连续多次输入错误的用户名或密码时接收到HTTP 401错误。

    
    文章转载自网管之家:http://www.bitscn.com/pdb/php/200701/95251.html 并根据笔者实验作了部分修改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

配置apache服务器的用户认证 的相关文章

  • 如何获取hive中的数据库用户名和密码

    正在编写jdbc程序来连接hive数据库 我希望在连接 url 中提供用户名和密码 我不知道如何使用 hive QL 获取用户名和密码 有人可以帮我吗 Exception in thread main java sql SQLNonTran
  • 使用 Apache 将端点转发到同一主机上的不同端口

    我正在尝试将 Apache 配置为以不同的方式处理应用程序的某些端点 我需要 api appname 和 admin 转发到同一主机上的单独 Tomcat 实例 显然在不同的端口上运行 Apache 正在侦听 443 SSL 浏览 Apac
  • 什么是 .htaccess 文件?

    我是 Zend 框架的初学者 我想了解更多关于 htaccess 文件及其用途 有人可以帮助我吗 我找到了一个这样的例子 htaccess 文件 AuthName Member s Area Name AuthUserFile path t
  • 使用 .htaccess 重定向主域但不重定向某些子域

    目前我有 Redirect 302 http www example com 虽然我仍然希望发生此重定向 但如果他们说 我不希望它重定向他们foo mydomain com或该子域上的任何其他页面 我怎样才能做到这一点 要以这种方式更具体
  • 为整个服务器/域强制使用 https

    我正在开发一些只能通过 https 访问的表单 我有一个专用服务器 有自己的证书和所有好东西 所以我的问题实际上有两个 1 强制每个请求都为 https 的最佳方法是什么 有没有比这个 htacess mod rewrite 规则更好的方法
  • php 的内容长度标头被覆盖!

    我试图弄清楚为什么 php 的 Content Length 标头被覆盖 这是演示 php 获取标头的请求 curl I http someserver com demo php HTTP 1 1 200 OK Date Tue 19 Ju
  • 一个域上的 ProxyPass 和 DocumentRoot

    假设我有以下配置
  • Apache 服务器(xampp)在使用 openssl 函数时崩溃

    我正在尝试使用 php ini 生成私钥 公钥对 服务器 Apache 2 4 3 Win32 OpenSSL 1 0 1c PHP 5 4 7 操作系统是 Windows XP SP3 安装了所有 Windows 更新 我正在尝试执行以下
  • 如何在 Windows 上的 Apache 服务器上运行我的 Asp.net Core 应用程序?

    Asp net core 是开源的 可以在 Linux Windows 和 Mac 等任何操作系统上运行 我的问题是 是否可以在 Windows 操作系统上的 apache 服务器上运行而不是在 IIS 服务器上运行 asp net cor
  • node.js 与 Apache PHP 一起运行?

    我正在尝试了解 Node js 我对我的 LAMP 设置非常满意 因为它目前满足我的要求 虽然我想在我的 PHP 应用程序中添加一些实时功能 例如显示当前登录我的网站的所有用户以及可能的聊天功能 我不想更换我的 PHP 后端 但我确实想要可
  • 在 Bitnami LAMP 堆栈中设置和访问 PHP-FPM 状态页面

    我想查看 Bitnami LAMP 堆栈系统上的 PHP FPM 状态页面 但是 当我尝试时 我得到一个空白页 或者一条错误消息 Request exceeded the limit of 10 internal redirects due
  • 匹配 mod_rewrite 规则正则表达式中的问号

    我正在寻找使用多个子字符串重写网址 一个子字符串作为子目录被请求 而任何其他子字符串作为普通查询字符串参数被请求 例如 我想重写 url http www mysite com mark friends page 2 to http www
  • 如何从 apache 中删除日期标头?

    我需要最小化 Apache HTTP 响应标头 现在我将它们减少如下 HTTP 1 1 200 OK Date Thu 25 Mar 2010 21 57 41 GMT Server Apache Content Type text htm
  • Mongrel::DirHandler 相当于 Passenger

    我正在使用 Mongrel DirHandler 来控制静态文件的响应标头 这在我的开发机器上效果很好 我的生产机器使用 Passenger 因此我的标头未设置 使用 Passenger 时如何控制静态文件的标头 我的环境中的片段 rb i
  • mod_fcgid + PHP + apache 锁定

    我正在运行一个相当典型的 LAMP 堆栈 其中 PHP 通过 mod fcgid 运行 考虑到服务器收到的流量 我认为服务器处于 高负载 状态 存在一个间歇性问题 当访问依赖 PHP 的站点时 Apache 报告所有连接都处于 正在发送内容
  • Apache httpd:根据其他*响应*标头有条件地设置响应标头

    有没有办法有条件地设置新的响应标头 其中条件使用另一个response标题 具体来说 仅当响应具有特定的 Content Type 时才应设置新的响应标头 我调查过模组头 http httpd apache org docs 2 2 mod
  • 在 Maven Shade 插件中包含依赖项

    我正在尝试使用 Apache 的 commons lang3 创建一个可部署的 jar 但是 我的 Hadoop 所在的 AWS 集群不包含此库 因此我收到了 classNotFoundException 我想我需要手动添加该依赖项 但我在
  • PCRE 库版本太旧

    Bug Genie 3 需要 PCRE 库 8 0 或更高版本 你有 版本 7 8 2008 09 05 将您的系统更新到最新版本 你常用的来源 在我查看问题并尝试通过以下步骤更新我的 PCRE 库后 wget the latest sou
  • 比较 nginx+Apache+mod_wsgi 与 nginx+uWSGI?

    在生产中使用 nginx Apache mod wsgi 与 nginx uWSGI vurtualenv 有何优缺点 我在自 2007 年以来开发的 mod wsgi 中看到了第一个变体的优点 并且具有更稳定的版本和易于管理 第二种变体的
  • 用作 MAMP 起始页 URL 的 index.* 文件在哪里?

    我试图了解 MAMP 如何管理 Apache Web 服务器 但我找不到index 用作 MAMP 起始页的文件 虚拟主机配置 httpd vhosts conf 不包括在内并且Applications MAMP htdocs仅包含我自己的

随机推荐

  • C语言:存取结构体成员的点运算符(.)和箭头运算符(->)的区别

    一直以为这两个是没有什么区别的 xff0c 可以相互替换 xff0c 今天又翻了一下 C语言核心技术 xff0c 明白了其中的奥妙 相同点 xff1a 两个都是二元操作符 xff0c 其右操作符是成员的名称 不同点 xff1a 点操作符左边
  • DB2 命令行中如何执行sql脚本

    原文链接 xff1a http space itpub net 8231934 viewspace 584635 db2 61 gt connect to dbName user xxx using password db2 61 gt s
  • 性能测试知多少 --并发用户数与TPS之间的关系

    1 背景 在做性能测试的时候 xff0c 很多人都用并发用户数来衡量系统的性能 xff0c 觉得系统能支撑的并发用户数越多 xff0c 系统的性能就越好 xff1b 对TPS不是非常理解 xff0c 也根本不知道它们之间的关系 xff0c
  • ubuntu编译 opencv undefined referece to `cv::imread()`

    Ubuntu下编译一个C 43 43 文件 xff0c C 43 43 源程序中使用了opencv xff0c opencv的安装没有问题 xff0c 但是在编译的过程中出现如下错误 xff1a undefined reference to
  • 基于深度学习的3D pose estimation总结(包括几篇2D pose estimation)

    一 任务描述 给定一幅图或者是一段视频 xff0c 人体姿态估计就是恢复出其中的人体关节点位置的过程 二 挑战和难点 1 人体肢体运动较为灵活 xff1b 2 视角的变化 xff1b 3 附着物的变化 xff08 比如遮挡 xff0c 衣物
  • STM32的空闲中断

    最近发现了STM32的USART的空闲中断非常的舒爽 xff0c 但是在前期配置的时候会出现一些小问题导致没有办法进入终中断或者是一直空闲中断 xff0c 现将它记下来 xff0c 给各位和自己留一个参考 xff1a 1 不进入中断 我是这
  • Github上最受欢迎的7个开源AI机器学习框架

    在过去的几年中 xff0c 人工智能正在占领技术的许多领域 来自不同背景的开发人员最终意识到了AI为他们带来的机遇 xff0c 而不管他们的需求如何 在今天的文章中 xff0c 我们列出了7种最佳的开源AI 机器学习系统和框架 1 Tens
  • ubuntu更换shell

    ubuntu更换shell zsh配置 span class token comment 安装zsh span span class token function sudo span span class token function ap
  • 网络调试助手NetAssist的使用

    一 使用场景 xff1a 项目定制需求 xff1a 前端的车载终端把gps 报警信息 报警图片 其他检测数据发往约定的第三方服务器 xff0c 车载终端通过公网 xff08 SIM拨号或者有线网 xff09 以udp或者tcp连接服务器 x
  • vlc代码分析(4)——mpgv的demux

    Mpgv c 是对mpeg vedio的解码部分 xff0c 从demux开始 xff0c 到sample到输出 其中 xff0c 核心部分是函数ParseMPEGBlock 两种数据格式 xff1a video format 是video
  • 关于使用CMT2300A FIFO缓存区间设置为64Byte的问题

    首先请看 xff0c CMT2300A 是什么产品 xff0c 或者说是 模组吗 xff1f 请看介绍 xff1a https blog csdn net sishuihuahua article details 105095994 以及R
  • 不合理超时设置带来的“坑”

    在后台服务的实现中 xff0c 我们通过基于TCP UDP协议封装起来的RPC机制实现了跟不同系统的通信 xff0c 进而协同各个系统完成一系列业务流程和功能的执行 xff0c 在这个过程中 xff0c 每个参与合作的子系统都有自己的能力描
  • 以太坊的三种同步模式

    全同步 xff1a 获取区块链所有区块的header和body xff0c 并校验其中的每一笔交易 xff0c 需要下载所有的区块数据信息 xff0c 同步速度最慢 xff0c 但是数据最全 xff1b 快速同步 xff1a 获取区块链所有
  • 基于订单号可重入的交易系统接口设计探讨

    基于订单号可重入的交易系统接口设计探讨 在交易系统的设计和实现中 xff0c 接口的可重入性设计是及其关键的 xff0c 可重入性也叫接口操作的冥等性保障 xff0c 那么什么叫冥等性呢 xff1f 在交易系统中 xff0c 为什么需要这个
  • 什么是手机的IMEI?

    一 xff0c IMEI是什么 xff1f IMEI xff08 International Mobile Equipment Identity xff09 是移动设备国际身份码的缩写 是由15位数字组成的 电子串号 xff0c 该码是全球
  • PBOC2.0安全系列之—脱机认证之静态数据认证(SDA)

    PBOC2 0安全系列之 脱机认证之静态数据认证 SDA 一 xff0c 什么是PBOC2 0 2005年3月13日 xff0c 人民银行发布第55号文 xff0c 正式颁发了 中国金融集成电路 xff08 IC xff09 卡规范 简称P
  • 第三方支付架构设计之—帐户体系

    第三方支付架构设计之 帐户体系 一 xff0c 什么是第三方支付 xff1f 什么是第三方支付 xff1f 相信很多人对这个名字很熟悉 xff0c 不管是从各种媒体等都经常听到 xff0c 可以说是耳熟能熟 但 xff0c 如果非得给这个名
  • ELF文件格式详解

    ARM的可执行文件的格式是ELF格式文件 xff0c 下文对ELF格式做个详细的介绍 序言 1 OBJECT文件 导言 ELF头 ELF Header Sections String表 String Table Symbol表 Symbol
  • ROS小车(SLAM+物体追踪)

    属于交通运输工程设计的论文 xff0c 包含SLAM与物体追踪这两个方向 ROS智能车设计 一 系统描述 1 车轮子 单轮平衡式结构 xff0c 能量利用率高 xff0c 但转弯的时候需要倾角高速运动 xff0c 很难控制 差速转向平衡两轮
  • 配置apache服务器的用户认证

    经常上网的读者会遇到这种情况 xff1a 访问一些网站的某些资源时 xff0c 浏览器弹出一个对话框 xff0c 要求输入用户名和密码来获取对资源的访问 这就是用户认证的一种技术 用户认证是保护网络系统资源的第一道防线 xff0c 它控制着