猎鹰钩

talons的Python项目详细描述


#鹰爪==猎鹰钩[![构建状态](https://travis ci.org/talons/talons.png)(https://travis ci.org/talons/talons)

talons是一个wsgi中间件库,旨在与用于构建restful api的轻量级python框架配合使用。与鹰爪一样,Tracon的目标是快速、轻量级和
灵活。
BR/> Talon中的第一个中间件是认证中间件,使一个BR/>或更多的后端身份插件处理认证。
BR/>什么是“爪”?

`talons.auth`是一个命名空间包,它包含
构造识别和身份验证中间件和插件的实用程序
专为运行Falcon WSGi微框架的应用程序
构建Rest API而设计。

因此:

`` python
import falcon

falcon.api实例是可调用的wsgi应用程序
app=falcon.api()
```

我们只需实例化
所需的“talons.auth”中间件并将其提供给“falcon.api()”调用:

``python
import falcon
from talons.auth import middleware
from talons.auth import basicauth,httpheader,htpasswd

假设getappconfig()返回应用程序配置的字典
可能已从某些ini文件中读取的选项…
config=getappconfig()

auth_middleware=middleware.create_middleware(使用=[
basicauth.identifier来标识httpheader.identifier],
使用=htpasswd.authenticator进行身份验证,
**config

`````

存储。

身份验证涉及两个主要任务:

*标识希望进行身份验证的用户
*验证标识用户的凭据


派生自“talons.auth.interfaces.identifies”的类。identifies“实现一个”identified“方法,该方法从wsgi管道获取“falcon.request.request”对象
查看请求元素以确定请求用户是谁。


存储凭据信息的类--包括登录名、密码/密钥、
一组角色或组,以及有关请求用户的其他元数据--
是“talons.auth.interfaces.identity”类。` talons.auth.interfaces.identifies`
子类将此“identity”对象存储在wsgi环境的“wsgi.identity”存储桶中。

标识是真实的。

要使基于falcon的wsgi应用程序身份验证功能可用,只需创建具有一个或多个“talons.auth.identify”模块和一个或多个“talons.auth.authenticate”模块的中间件。我们甚至给了您一个helper
方法--“talons.auth.middleware.create戥middleware”--在一个调用中创建这样的中间件。每个
类都实现一个方法“identify()”,该方法将传入的“falcon.request.request`
对象作为其唯一参数。如果可以确定身份验证用户的身份,
,则identifier对象在wsgi环境的wsgi.identit中存储一个“talons.auth.interfaces.identity”对象y`key并返回true。


可以向
`talons.auth.middleware.create_middleware`方法提供多个标识符类,以支持从wsgi请求收集标识信息的多种方式。每个标识符的
`identify()`方法检查wsgi.identity`键是否已在wsgi环境中设置。如果是,则该方法只返回true,不会尝试进一步处理任何内容。


http
凭证信息的标题。如果找到“authenticate”http头并包含有效的凭据信息,则该标识信息将存储在“wsgi.identity”wsgi环境密钥中。` talons.auth.http header.identifier`在传入的wsgi请求中查找可配置的http头,并使用http头的值
构造一个'talons.auth.identity'对象。


一组配置选项控制此标识符类的行为:

*`httpheader\u user`:http头以查找用户/登录
名称(必需)
*`http header_key`:http header以查找密码/密钥
(必需)
*`httpheader_$attribute`:http header,如果找到,将
用于向存储在wsgi
管道中的标识对象添加$attribute。(可选)

上述配置选项作为关键字
参数提供给构造函数。


*` x-auth-password`--此头的值将是认证
用户密码
*`x-auth-domain`--此头的值应被视为认证
标识时将考虑的认证域。我们希望将此值存储在“talons.auth.identity”对象的
“domain”属性中。


我们的配置选项如下:

````
httpheader_user=x-auth-user
httpheader_key=x-auth-password
httpheader_domain=x-auth-domain
``

` talons.auth.interfaces.authenticates`被称为“验证器”。每个authenticator实现一个方法
`authenticate()`,它以一个'talons.auth.interfaces.identity`对象
作为唯一参数。


不同的实现将依赖于不同的
后端存储系统来验证传入的标识/凭据。
如果身份验证成功,则方法返回true,否则为False。

talons附带了几个简单的验证器插件示例。


` talons.auth.external.authenticator`

有一个主配置选项的通用验证器插件,
“external_authn_callable”,应该是接受单个参数的函数或类的“module.function”或“module.class.method”点式导入表示法。此函数将由“talons.auth.authenticate.external.authenticator”的实例调用,以验证请求的凭据。


此外,还有两个其他配置选项指示
“external\u authfn”函数是否可以设置所提供标识的角色或组属性:


*` external_sets_roles`:boolean(默认为false)。真值
表示插件可以在identity
对象上设置roles属性。

*`external_sets_groups`:boolean(默认为false)。真正的值
表示插件可以在identity
对象上设置groups属性。


每个用户的salted、encrypted
密码存储在redis kvs中,与用户所属角色的逗号分隔列表一起,

存储的密码:
假设密码以以下格式存储在redis中:
salt:hashed pass
==存储的“哈希”过程



def authenticate(标识):
user=identity.login
pass=identity.key

用户\记录:
存储的\过程,角色\列表=用户\记录。拆分('')
验证成功=_过程匹配存储的\过程(过程,存储的\过程)
如果验证成功:
标识。角色=角色\列表。拆分(',')
返回auth_success
```

我们将为
`talons.auth.external.authenticator`构造函数提供以下配置选项:

*`external_authn_callable=application.auth.authenticate`
*`external_sets_roles=true`


`talons.auth.htpasswd.authenticator`

查询apache htpasswd文件以检查
请求的凭据。插件只有一个配置选项:

*`htpasswd_path`:用于身份验证检查的apache htpasswd文件的文件路径。


authorizers


每个授权程序都实现一个方法
`authorize()`,该方法接受一个'talons.auth.interfaces.identity`对象,
和一个'talons.auth.interfaces.resourceaction'对象。

`resourceaction'对象当前只有一个方法,`to\u string`,
返回描述所请求的http资源的“点符号”字符串。


例如,假设身份向:


post/users/12345/groups发出了http请求


提供给“authorize”函数的“resourceaction.to-string”方法将生成字符串“users.12345.groups.post”。此字符串对于将字符串与提供的标识对象进行比较的插件非常有用。
请参见下面的示例,以更清楚地了解这一点。

目前,只有一个authorizer内置到talons中:talons.auth.external.authorizer类。与它的姐妹
`talons.auth.external.authenticator`一样,它接受一个外部可调用函数,该函数接受identity和resource action参数,并返回是否允许
标识对资源执行操作。单个
配置参数称为“external_authz_callable”。

让我们继续上面的示例,并添加一个外部可调用的
将用作授权程序。此可调用函数将
“resourceaction”to-string方法的结果与提供的identity
对象和正则表达式的hashmap进行比较,以确定是否允许
用户执行一个操作。

假设我们的应用程序有一个名为`/application/auth.py`的python文件,该文件包含上述身份验证代码,并且如下所示:


``python
import re



def self_或_admin(匹配,标识:

如果标识具有管理员角色,或者标识
与请求用户匹配,则返回true。

”如果标识中具有“admin”,则返回true。角色:
返回true
返回match.groups(1)==identity.login


返回true


u policy规则=[
(r'^users'(^.++.get$'.get$'.get$'.get$'.self或管理员,
(r'^users.post$'.post$'任何人,
]


policicies=[[[]
regex,fn在regex,fn在策略规则:
policicies.append((re.compile(regex,fn))



deauthorize(身份,资源,资源,动作):user=identity.login
res r/>resu string=resource,action.to_string()
,p,

p是的fn在策略中:
m=p.match(res_string)
如果m:
返回fn(m,identity)
````

我们将为“talons.auth.external.authorizer”构造函数提供以下配置
选项:

*`external\u authz\u callable=application.auth.authorize`



为什么选择“talons.auth”?
==
==


为什么不直接使用像[repose.who]这样的中间件(http://docs.repoze.org/who/2.0/index.html)来实现
身份验证插件?为什么要在这里重新发明轮子?

有几个原因,没有特别的顺序:

*使用webob库。我不是它的粉丝,因为多年来我遇到过很多关于这个库的问题。也不是它的粉丝。这是一个对传统C++程序员来说设计为BR/>的库,而不是感觉它是为Python开发人员设计的。
只需使用[ABC](HTTP://DOCS.python .Org/2/LabyAc/ABC.HTML)模块,如果您绝对必须
有严格的接口强制执行。
*试图重写类似于构造函数中的日志记录设置的事情。中间件。
*不粘贴。
*想要符合Falcon应用程序构建模式的东西。

但是嘿,repoze.who本质上没有什么问题。如果你喜欢它,并且它对你有效,那么就使用它。


\contribution

[jay pipes](http://joinfu.com)维护Talons库。您通常可以在freenode irc openstack dev
频道上找到他。对改进和增强爪子感兴趣?始终欢迎拉取请求。

除非适用法律要求或书面同意,否则您可以在http://www.apache.org/licenses/license-2.0


http://www.apache.org/licenses/license-2.0


获取许可证副本,根据许可证分发的软件是按“原样”分发的,无任何明示或暗示的保证或条件。有关
许可下管理权限和限制的特定语言,请参阅许可证。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java关闭域实例   java如何获得JTable列的头组件的最小首选宽度,以便其大小不能小于该值?   使用时使用java Jsoup。孩子们()。跳出边界性感觉   类静态初始化块内的java类用法   java ParseCrashReporting*。在其Android SDK的1.11.0中找不到jar   javahsqldb组织。springframework。刀。复杂选择上的TransientDataAccessResourceException   java EJB 3.1@SessionScoped Bean holding登录信息注销问题   java如何跟踪重复警报何时关闭并更新设置值?   具有可变参数类型的java接口方法   使用openstack4j计算查询的java连接超时   java这是一种双向的一对一关系吗?   java如何重置EventStream中的最后一个累积值?   java如何在超级抽象类中使用@Bean?   使用多部分上传java图像   java列出了已解析的SQL SELECT语句的所有表/列   java使用内部类实现单元测试类的正确方法   使用AWS API网关的java ContentType飞行前处理与自己的Rest服务器   调用dispose()后重新创建JinternalFrame对象   字符编码通过java编写一个以UTF8编码的文本文件,其中包含BOM表。尼奥