Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在CherryPy中使用cookies和HTTP基本身份验证?_Python_Session_Authentication_Cookies_Cherrypy - Fatal编程技术网

Python 如何在CherryPy中使用cookies和HTTP基本身份验证?

Python 如何在CherryPy中使用cookies和HTTP基本身份验证?,python,session,authentication,cookies,cherrypy,Python,Session,Authentication,Cookies,Cherrypy,我有一个需要身份验证的CherryPy web应用程序。我的HTTP基本身份验证配置如下: app_config = { '/' : { 'tools.sessions.on': True, 'tools.sessions.name': 'zknsrv', 'tools.auth_basic.on': True, 'tools.auth_basic.realm': 'zknsrv', 'tools.auth_

我有一个需要身份验证的CherryPy web应用程序。我的HTTP基本身份验证配置如下:

app_config = {
    '/' : {
        'tools.sessions.on': True,
        'tools.sessions.name': 'zknsrv',
        'tools.auth_basic.on': True,
        'tools.auth_basic.realm': 'zknsrv',
        'tools.auth_basic.checkpassword': checkpassword,
        }
    }
curl --cookie 'zknsrv=821aaad0ba34fd51f77b2452c7ae3c182237deb3' http://localhost/AuthTest
config_root = {
    '/' : {
        'tools.zkauth.on': True, 
        'tools.sessions.on': True,
        'tools.sessions.name': 'zknsrv',
        }
    }
HTTP auth在这一点上非常有效。例如,这将为我提供我在
AuthTest
中定义的成功登录消息:

curl http://realuser:realpass@localhost/AuthTest/
由于会话已打开,我可以保存cookies并检查CherryPy设置的cookies:

curl --cookie-jar cookie.jar http://realuser:realpass@localhost/AuthTest/
cookie.jar
文件将以如下方式结束:

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

localhost       FALSE   /       FALSE   1348640978      zknsrv  821aaad0ba34fd51f77b2452c7ae3c182237deb3
但是,如果我在没有用户名和密码的情况下提供此会话ID,则会出现HTTP
401未授权的故障,如下所示:

app_config = {
    '/' : {
        'tools.sessions.on': True,
        'tools.sessions.name': 'zknsrv',
        'tools.auth_basic.on': True,
        'tools.auth_basic.realm': 'zknsrv',
        'tools.auth_basic.checkpassword': checkpassword,
        }
    }
curl --cookie 'zknsrv=821aaad0ba34fd51f77b2452c7ae3c182237deb3' http://localhost/AuthTest
config_root = {
    '/' : {
        'tools.zkauth.on': True, 
        'tools.sessions.on': True,
        'tools.sessions.name': 'zknsrv',
        }
    }
我错过了什么

非常感谢您的帮助。

因此,简短的回答是您可以这样做,但是您必须编写自己的CherryPy工具(在处理程序之前编写一个
),并且您不能在CherryPy配置中启用基本身份验证(也就是说,您不应该执行类似
tools.auth.on
tools.auth.Basic…
等操作)-您必须自己处理HTTP基本身份验证。原因是内置的基本身份验证内容显然非常原始。如果您像上面那样通过启用基本身份验证来保护某些内容,它将在检查会话之前进行身份验证检查,而您的cookie将不会执行任何操作

我的解决方案是散文 幸运的是,即使CherryPy没有办法同时完成这两个内置任务,您仍然可以使用其内置会话代码。您仍然需要编写自己的代码来处理基本身份验证部分,但总的来说这并不是那么糟糕,使用会话代码是一个巨大的成功,因为编写自定义会话管理器是将安全漏洞引入您的webapp的一个好方法

我最终能够从CherrypyWiki上的一个名为。该代码使用CP会话,而不是基本身份验证,它使用一个带有登录表单的特殊页面提交
?username=username&password=password
。我所做的基本上只是将提供的
check\u auth
函数从使用特殊登录页面更改为使用HTTP auth头

通常,您需要一个可以添加为CherryPy工具的函数,特别是一个
before\u handler
。(在原始代码中,此函数被称为
check_auth()
,但我将其重命名为
protect()
)此函数首先尝试查看cookie是否包含(有效)会话ID,如果失败,则尝试查看头中是否有HTTP身份验证信息

然后需要一种方法来要求对给定页面进行身份验证;我使用
require()
,加上一些条件,这些条件只是返回
True
的可调用项。在我的例子中,这些条件是
zkn_admin()
,和
user_is()
函数;如果您有更复杂的需求,您可能还需要查看原始代码中的
member\u of()
any\u of()
,以及
all\u of()

如果您这样做,您已经有了登录的方法—您只需向使用
@require()
装饰器保护的任何URL提交有效的会话cookie或HTTPBA凭据。您现在需要的只是一种注销方式

(原来的代码有一个
AuthController
类,它包含
login()
logout()
,您可以在HTTP文档树中使用整个
AuthController
对象,只需放置
auth=AuthController()
在CherryPy根类中,并使用URL(例如和)访问它。我的代码不使用authcontroller对象,只使用一些函数。)

关于我的代码的一些注释
  • 警告:因为我为HTTP auth头编写了自己的解析器,所以它只解析我告诉它的内容,这意味着只解析HTTP Basic auth,而不是Digest auth或其他任何内容。对于我的申请来说,这很好;对你来说,可能不是
  • 它假设在我的代码中其他地方定义了一些函数:
    user\u verify()
    user\u is\u admin()
  • 我还使用了一个
    debugprint()
    函数,该函数仅在设置
    DEBUG
    变量时打印输出,为了清晰起见,我将这些调用保留了下来
  • 您可以将其称为
    cherrypy.tools.which
    (参见最后一行);基于我的应用程序名,我将其命名为
    zkauth
    。不过,请注意不要将其称为
    auth
    ,或任何其他内置工具的名称
  • 然后,您必须在cherrypy配置中启用
    cherrypy.tools
    
  • 正如您从所有TODO:消息中所看到的,此代码仍然处于不断变化的状态,并且没有针对边缘情况进行100%的测试-对此感到抱歉!不过,我希望这仍然会给你足够的想法继续下去
我的解决方案,在代码中
谢谢,我也遇到了同样的问题,经过几次小小的调整,这个问题很好地解决了!!