Keg认证插件
Keg-Auth的Python项目详细描述
Keg Auth的自述文件
用法
安装
- 基本功能: pip install keg-auth
- 邮件(即,配置了邮件管理器,请参见下文): pip install keg-auth[mail]
- jwt(用于使用jwt令牌作为身份验证器): pip install keg-auth[jwt]
- LDAP(用于使用LDAP目标进行身份验证): pip install keg-auth[LDAP]
配置
- server name="somehost" :在create-user cli命令中生成url时keg auth需要 -如果需要,请包括端口号(例如 localhost:5000 )
- preferred="https" :这一点很重要,因此生成的与身份验证相关的URL是
- kegauth token expire mins :整数,默认为240分钟(4小时) -如果启用了邮件功能并且模型中有令牌,则会影响验证令牌保持有效的时间
- kegauth cli user :字符串列表,默认为 ['email'] -命名要由cli用户命令接受并传递给模型的参数
-
电子邮件设置
- kegauth email site="keg application" :如果启用了邮件,则在电子邮件正文中使用
- kegauth email site abbr="keg app :如果启用了邮件,则用于电子邮件主题中
-
示例消息:
- 主题:[Keg App]密码重置链接
- 正文:有人要求重新设置你的桶申请密码。如果不是你…
< DL> 安全。您可以有一个ssl重定向,但是当它启动时,密钥将 已在URL中发送。 扩展名
- 设置身份验证管理器(应用内设置或扩展)
- 实体注册表连接用户、组、绑定和权限实体。你需要 创建与身份验证管理器关联的注册表,并从 型号(参见型号说明)
- 请注意,邮件管理器是可选的。如果未提供邮件管理器,则不会发送邮件
- 权限可以作为简单的字符串令牌传递,也可以作为 (token,description)的元组传递
登录身份验证器控制用户的验证
- 包括用于从登录路由验证用户的逻辑,以及其他视图层操作 用户工作流程所需(例如验证电子邮件、密码重置等)
-
身份验证程序可以在身份验证管理器上指定:
- 'keg'是默认的主身份验证程序,使用用户名/密码
- 验证管理器(电子邮件,登录/验证程序=ldapauthenticator)
-
LDAp认证
- 来自keg_auth import ldapauthenticator
- 使用需要安装的pyldap: pip install keg auth[ldap]
-
附加配置:
- kegauth_ldap_test_mode:如果为true,则绕过ldap调用。默认为false
- kegauth_ldap_服务器url:用于查询的目标ldap服务器
- kegauth_ldap_dn_format:为查询设置的可格式化字符串 -例如, uid={},dc=example,dc=org
当用户不在会话中并且标识数据在请求中时,请求加载程序将运行
- authmanager(mail_ext,request_loaders=jwtrequestloader)
- 令牌身份验证器,如jwtrequestloader,有一个 创建访问令牌的方法 - 令牌= 身份验证管理器。获取请求加载程序('jwt')。创建访问令牌(用户) JWT: - 来自keg_auth import jwtrequestloader -使用扩展的烧瓶jwt,需要安装: pip install keg auth[jwt]
蓝图
- 包括一个auth蓝图和你的应用的蓝图,其中包括登录视图 以及用户/组/捆绑包管理。需要authmanager实例:
fromkeg_authimportmake_blueprintfrommy_app.extensionsimportauth_managerauth_bp=make_blueprint(__name__,auth_manager)
cli是初级的,在auth组中只有一个create user命令。你可以延长 使用应用程序的auth_manager上的cli_group属性进行分组,但您需要访问 应用程序在启动时执行此操作。你可以用一个事件信号来处理这个-只要确定 您的应用程序的"访问"模块有活动的位置。
# in app definitionvisit_modules=['.events']# in events modulefromkeg.signalsimportinit_completefromkeg_auth_ta.cliimportauth_cli_extensions@init_complete.connectdefinit_app_cli(app):auth_cli_extensions(app)# in clidefauth_cli_extensions(app):@app.auth_manager.cli_group.command('command-extension')defcommand_extension():pass
默认情况下,cli create user命令有一个必需的参数(email)。如果你愿意的话 附加参数,将arg名称列表放入 kegauth_cli_user_args config
型号
- 使用现有的mixin创建实体,并将它们注册到 桶认证
- 注意:用户模型假设实体与usermixin混合 将具有pk id
- 电子邮件地址和令牌验证位于 useremailmixin -也就是说,如果你的应用程序不使用电子邮件令牌验证密码,请将该混音保留在外
fromkeg.dbimportdbfromkeg_elements.db.mixinsimportDefaultColsMixin,MethodsMixinfromkeg_authimportUserMixin,UserEmailMixin,PermissionMixin,BundleMixin,GroupMixinfrommy_app.extensionsimportauth_entity_registryclassEntityMixin(DefaultColsMixin,MethodsMixin):pass@auth_entity_registry.register_userclassUser(db.Model,UserEmailMixin,UserMixin,EntityMixin):__tablename__='users'@auth_entity_registry.register_permissionclassPermission(db.Model,PermissionMixin,EntityMixin):__tablename__='permissions'def__repr__(self):return'<Permission id={} token={}>'.format(self.id,self.token)@auth_entity_registry.register_bundleclassBundle(db.Model,BundleMixin,EntityMixin):__tablename__='bundles'@auth_entity_registry.register_groupclassGroup(db.Model,GroupMixin,EntityMixin):__tablename__='groups'
导航帮助程序
- keg auth提供导航帮助程序来设置菜单树,树上的节点是 根据目标端点的身份验证/授权要求进行限制
- 用法包括使用navitem/navurl对象设置菜单结构。请注意,上的权限 出于导航目的,路线可能会被覆盖
- 可以在auth manager上跟踪菜单,它将在 登录/注销
- keg_auth/navigation.html 模板有一个助手 呈现菜单 - {%import"keg_auth/navigation.html"作为navigation%} - 呈现菜单(auth_manager.menus['main'])
- 示例:
fromkeg.signalsimportinit_completefromkeg_authimportNavItem,NavURL@init_complete.connectdefinit_navigation(app):app.auth_manager.add_navigation_menu('main',NavItem(NavItem('Home',NavURL('public.home')),NavItem('Nesting',NavItem('Secret1',NavURL('private.secret1')),NavItem('Secret1 Class',NavURL('private.secret1-class')),),NavItem('Permissions On Stock Methods',NavURL('private.secret2')),NavItem('Permissions On Methods',NavURL('private.someroute')),NavItem('Permissions On Class And Method',NavURL('private.secret4')),NavItem('Permissions On NavURL',NavURL('private.secret3',requires_permissions='permission3')),NavItem('User Manage',NavURL('auth.user:add')),))
模板
- 为auth视图提供了模板,以及基本crud模板
- 基本模板是从设置中引用的。其中第一个定义用于: - 基本模板 - kegauth_base_模板
视图
- 使用requires*decorators可限制访问视图
- 每个decorator都可以用作类decorator 查看方法
- 另外,可以在蓝图上使用decorator来将需求应用到所有 蓝图上的路线
- 需要用户
- 要求用户在继续之前进行身份验证 (仅限身份验证)
- 用法: @需要用户 或 @需要用户 (两种用法 如果不需要辅助身份验证器,则模式相同)
- 注意:这与 flask_login.login类似_必需的 ,但是 可以用作类/蓝图装饰器
- 你可以通过一个自定义的 on_authentication_failure 调用装饰器,否则它将 重定向到登录页
- 修饰的类/蓝图可能有一个自定义的 on_authentication_failure 实例方法 把一个传给装饰工
-
需要u权限
- 要求用户在继续之前获得有条件授权 (身份验证+授权)
- has_any 和 has_all 帮助程序可用于构造 复杂条件,使用字符串权限标记,嵌套 帮助程序和可调用方法
- 你可以通过一个自定义的 on\u authorization\u failure 调用装饰器,否则它将 响应403未授权
- 修饰的类/蓝图可能有一个自定义的 on_authorization_failure 实例方法 把一个传给装饰工
-
用法:
- @需要权限(('token1', 'token2'))
- @需要_权限(has _any('token1', 'token2'))
- @需要_权限(has _all('token1', 'token2'))
- @需要_权限(has _all(has _any('token1', 'token2'), 'token3')
- @需要权限(可调用的自定义授权,接受用户参数)
-
提供了一个标准的crud视图,其中包含add、edit、delete和list"actions"
- 来自Keg_auth import crudview
- 由于标准操作路由是预定义的,因此可以将特定权限分配给 它们位于视图的 权限 字典中,由操作键入(例如 权限['add']='foo' )
测试期间的用户登录
这个库提供了一个 flask_webtest.testapp的子类,使设置 测试期间登录的用户:
fromkeg_auth.testingimportAuthTestAppclassTestViews(object):defsetup(self):ents.User.delete_cascaded()deftest_authenticated_client(self):""" Demonstrate logging in at the client level. The login will apply to all requests made by this client. """user=ents.User.testing_create()client=AuthTestApp(flask.current_app,user=user)resp=client.get('/secret2',status=200)assertresp.text=='secret2'deftest_authenticated_request(self):""" Demonstrate logging in at the request level. The login will only apply to one request. """user=ents.User.testing_create(permissions=('permission1','permission2'))client=AuthTestApp(flask.current_app)resp=client.get('/secret-page',status=200,user=user)assertresp.text=='secret-page'# User should only stick around for a single request (and will get a 302 redirect to the)# login view.client.get('/secret-page',status=302)
还提供了一个helper类来设置客户机和用户,给定 在类定义上指定的权限:
fromkeg_auth.testingimportViewTestBaseclassTestMyView(ViewTestBase):permissions='permission1','permission2',...deftest_get(self):self.client.get('/foo')
不使用电子邮件功能
Keg Auth设计为开箱即用,使用电子邮件令牌发送到:
- 验证用户记录中的电子邮件地址
- 提供一种初始设置密码的方法,而不需要管理员设置已知密码
虽然这在许多情况下提供了良好的安全性,但有时电子邮件方法 不需要(例如,如果应用程序将在Internet不在的环境中运行 无障碍)。仅需对上述示例进行一些更改即可实现此目的:
- 离开用户模式
- 设置authmanager时不要指定邮件管理器
电子邮件/重置密码功能
- 电子邮件/重置密码电子邮件中的jwt令牌用
- 用户名/电子邮件(取决于启用的选项)
- 密码哈希
- 上次登录UTC
- 是否处于活动状态(已验证/已启用组合)