Python 如何在CherryPy中使用cookies和HTTP基本身份验证?
我有一个需要身份验证的CherryPy web应用程序。我的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_
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,则会出现HTTP401未授权的故障,如下所示:
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%的测试-对此感到抱歉!不过,我希望这仍然会给你足够的想法继续下去李>
我的解决方案,在代码中
谢谢,我也遇到了同样的问题,经过几次小小的调整,这个问题很好地解决了!!