您的位置:首页 > 理论基础 > 计算机网络

nginx用户认证配置( Basic HTTP authentication)及认证原理和实现

2016-12-28 11:16 861 查看
nginx用户认证配置( Basic HTTP authentication) - 运维生存时间  http://www.ttlsa.com/nginx/nginx-basic-http-authentication/

HTTP使用BASIC认证的原理及实现方法-atlantisholic-ITPUB博客  http://blog.itpub.net/23071790/viewspace-709367/


nginx用户认证配置( Basic HTTP authentication)

nginx_http_auth_basic_module模块实现让访问着,只有输入正确的用户密码才允许访问web内容。web上的一些内容不想被其他人知道,但是又想让部分人看到。nginx的http auth模块以及Apache http auth都是很好的解决方案。

默认情况下nginx已经安装了ngx_http_auth_basic_module模块,如果不需要这个模块,可以加上 --without-http_auth_basic_module 。


nginx basic auth指令

语法:     auth_basic string | off;

默认值:     auth_basic off;

配置段:     http, server, location, limit_except

默认表示不开启认证,后面如果跟上字符,这些字符会在弹窗中显示。

语法:     auth_basic_user_file file;

默认值:     —

配置段:     http, server, location, limit_except

用户密码文件,文件内容类似如下:

12ttlsauser1:password1ttlsauser2:password2:comment

nginx认证配置实例

1

2

3

4

5

6

7

8

9

10

11

12

13

server{

      server_name www.ttlsa.comttlsa.com;

 

       indexindex.htmlindex.php;

       root/data/site/www.ttlsa.com;      

 

       location/

       {

               auth_basic"nginx
basic http test for ttlsa.com";

               auth_basic_user_fileconf/htpasswd;

               autoindexon;

       }

}

备注:一定要注意auth_basic_user_file路径,否则会不厌其烦的出现403。

生成密码

可以使用htpasswd,或者使用openssl

123# printf "ttlsa:$(openssl passwd -crypt 123456)\n" >>conf/htpasswd# cat conf/htpasswd ttlsa:xyJkVhXGAZ8tM
账号:ttlsa
密码:123456reload nginx

1

# /usr/local/nginx-1.5.2/sbin/nginx
-s reload

效果如下:





http_auth_basic_module

 

完成~

//////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////

HTTP使用BASIC认证的原理及实现方法 2011-10-19 15:56:15

分类: Linux

一.   BASIC认证概述
在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务 器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为anjuta,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据 时,将密文附加于请求头(Request
Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。
 
二.   BASIC认证的过程
1.  客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证(即header中不带正确的Authorization字段),则客户端提供如下请求至服务器:

Get /index.html HTTP/1.0

Host:www.google.com
2.  服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:
HTTP/1.0 401 Unauthorised

Server: SokEvo/1.0

WWW-Authenticate: Basic realm="google.com"

Content-Type: text/html

Content-Length: xxx
3.  当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。

4.  用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容(即在header中自动加入Authorization字段):

Get /index.html HTTP/1.0
Host:www.google.com
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx

注:xxxx....表示加密后的用户名及密码。

5.  服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端:

 
三.         BASIC认证的缺点
HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如大家所用路由器的配置页面的认证,几乎 都采取了这种方式。其缺点是没有灵活可靠的认证策略,如无法提供域(domain或realm)认证功能,另外,BASE64的加密强度非常低(直接把header中的Authorization字段拿去base64解密即可),可以说仅 能防止sohu的搜索把它搜到了。当然,HTTP基本认证系统也可以与SSL或者Kerberos结合,实现安全性能较高(相对)的认证系统

 
四.         BASIC认证的JAVA实现代码
 
HttpSession session=request.getSession();
         String user=(String)session.getAttribute("user");
         String pass;
         if(user==null){
             try{
                response.setCharacterEncoding("GBK");
                PrintWriter ut=response.getWriter();
                String authorization=request.getHeader("authorization");
                if(authorization==null||authorization.equals("")){
                    response.setStatus(401);
                    response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");
                    out.print("对不起你没有权限!!");
                    return;
                }
                String userAndPass=new String(new BASE64Decoder().decodeBuffer(authorization.split("
")[1]));
                if(userAndPass.split(":").length<2){
                    response.setStatus(401);
                    response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");
                    out.print("对不起你没有权限!!");
                    return;
                }
                user=userAndPass.split(":")[0];
                pass=userAndPass.split(":")[1];
                if(user.equals("111")&&pass.equals("111")){
                    session.setAttribute("user",user);
                    RequestDispatcher dispatcher=request.getRequestDispatcher("index.jsp");
                    dispatcher.forward(request,response);
                }else{
                    response.setStatus(401);
                    response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");
                    out.print("对不起你没有权限!!");
                    return;
                }
             }catch(Exception ex){
                ex.printStackTrace();
             }
         }else{
             RequestDispatcher dispatcher=request.getRequestDispatcher("index.jsp");
             dispatcher.forward(request,response);
       }
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息