好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

浏览器Basic Auth方式认证的phpMyAdmin自动登录 - ph

浏览器Basic Auth方式认证的phpMyAdmin自动登录

一、需求

自动登录 phpMyAdmin,最终能够解决自动登录所有使用 Basic Auth 方式认证的网页.

二、phpMyAdmin 的四种认证登陆方式

1.config 配置文件。直接将允许登录的用户名和密码写在 config.inc.php 配置文件中。

2.cookie。最常用的方式,通过填写首页表单进行登录。

3.http。HTTP Basic Authentication 方式,使用浏览器的弹出式对话框进行登录。与 cookie 方式的区别主要在于用户体验。

4.signon。单点登录,适用于系统集成。用户登录了某系统后,不必再输用户名密码即可以一键登录 phpMyAdmin。

参考:http://wiki.phpmyadmin.net/pma/Auth_types

按道理 signon 方式应该是满足需求的首选方案,只不过项目开发总是有妥协和迁就,要尽量少干预现有系统的运行。另外,在实现 signon 方式登录的同时,还需要保留原有的用户输用户名密码的登录方式,即备用登录方案。这就将问题复杂化了。

三、什么是 Basic Auth

现有系统使用了 Basic Auth 方式,于是我研究了怎样能够在这种情况下也一键登录,在访问一个需要 HTTP Basic Authentication 的 URL 时,如果你没有提供用户名和密码,服务器就会返回 401,这时浏览器会提示你输入用户名和密码,例子如下:

  • <?php 
  • if  (!isset($_SERVER[ 'PHP_AUTH_USER' ])) { 
  •     header('WWW-Authenticate: Basic realm="My Realm"' ); 
  •     header('HTTP/1.1 401 Unauthorized' ); 
  • else  { //开源代码phpfensi测试数据  
  •     echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"
  •     echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>"
  • ?> 

    保存为login.php,浏览 http://localhost/login.php 查看效果.

    浏览器Basic Auth:IE9和Chrome的弹出式认证对话框,在浏览器弹出的窗口中输入用户名密码,如果使用 Chrome 开发者工具(或者 Firebug)查看,会发现其实它只是多发送了一个类似下面的请求头:

    Authorization: Basic bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=

    四、Basic Auth 认证的自动登录解决方案

    要想通过认证,原则上有 2 种方法

    •一是在请求头中添加 Authorization(可用 Javascript 来实现):

    Authorization: [Basic 用户名和密码的base64加密字符串]

    •二是在 url 中添加用户名和密码(IE 不支持):

    http://username:password@domain测试数据/login.php

    用 js 添加请求头可以使用 XMLHttpRequest,实现代码如下:

  • <html> 
  • <head> 
  • <title>login</title> 
  • <script> 
  • function  login() { 
  •     var  username = document.getElementById( "username" ).value; 
  •     var  password = document.getElementById( "password" ).value; 
  •  
  •     xhr = new  XMLHttpRequest(); 
  •     xhr.open("POST" "http://localhost/login.php" false , username, password); 
  •     xhr.send(null ); 
  •  
  •     return  xhr.status == 200; 
  • </script> 
  • </head> 
  • <body> 
  • <form action="http://localhost/login.php"  method= "post"  onsubmit= "return login();"
  •     <fieldset> 
  •     <legend>Login</legend> 
  •     <label for = "username" >username:</label> 
  •     <input type="text"  id= "username"  name= "username"
  •  
  •     <label for = "password" >password:</label> 
  •     <input type="password"  id= "password"  name= "password"
  •  
  •     <input type="submit"  value= "subject"
  •     </fieldset> 
  • </form> 
  • </body> 
  • </html> 

    Basic Auth 认证的自动登录解决方案,总结下——

    1、用户名密码直接写在 URL 里。

    缺点:不够安全,且 IE 不支持。

    2、写一个登陆表单,php 将用户名密码填到表单中,然后页面 onload 时 js 生成 Authorization 请求头提交.

    缺点:本系统和 phpMyAdmin 必须在同一个域,例如本系统在 admin.phpfensi测试数据,而 phpMyAdmin 在 phpmyadmin.domain测试数据 这种情况 js 是无法跨域提交的。

    3、本系统将用户名密码 post 到 phpMyAdmin 所在域的一个表单,那个表单再拿来用 js 登陆.

    缺点:需要到 phpMyAdmin 所在域新增一个页面实现跨域.

    查看更多关于浏览器Basic Auth方式认证的phpMyAdmin自动登录 - ph的详细内容...

  •   阅读:60次