tg.ext.repoze.who are repoze.who plugins for turbogears 2(谁是repoze.who是涡轮齿轮2的插件)
tg.ext.repoze.who的Python项目详细描述
示例repoze.who tg2的中间件配置和插件。这个包
取决于repoze.who 0.8或更高版本。
尝试它
-将tg2安装到virtualenv中。
-通过"setup.py
install"将这个包安装到同一个virtualenv中。
-使用virtualenv的python创建一个tg2快速启动项目。
-in您的development.ini项目…
-在项目的config.middleware模块中,在"Custom Middleware here"下面添加以下内容:
dbsession)
-在模型中添加以下定义。
groups\u table=table('tg\u group',metadata,
column('group\u id',integer,primary\u key=true)、
column('group\u name',unicode(16),unique=true)、
column('display\u name',unicode(255)),
列('created',datetime,default=datetime.datetime.now)
用户表=表('tg_用户',元数据,
列('user_id',integer,primary_key=true),
列('user_name',unicode(16),unique=true),
列('email_address',unicode(255),unique=true),
列('display_name',unicode(255)),
列('password',unicode(40)),
列('created',datetime,default=datetime.datetime.now)
permissions_table=table('tg_permission',metadata,
列('permission_id',integer,primary_key=true),
列('权限名称',Unicode(16),唯一=真),
列('说明',Unicode(255))
user_group_table=table('tg_user_group',元数据,
列('user_id',整数,foreignkey('tg_user.user_id',
onupdate="cascade",ondelete="cascade"),
column('group_id',integer,foreignkey('tg_group.group_id',
onupdate="cascade",ondelete="cascade"))
group_permission_table=table('tg_group_permission',metadata,
column('group_id',integer,foreignkey('tg_group.group_id',
onupdate="cascade",ondelete="cascade"),
列('permission\u id',integer,foreignkey('tg\u permission.permission\u id',
onupdate="cascade",ondelete="cascade"))
)
可能需要其他
属性。
"
def repr(self):
return"<;user:email="%s",display name="%s">;"%(self.email地址,self.display名称)
def权限(self):
perms=set()
在self.groups中:
perms=perms set(g.permissions)
return perms
permissions=property(permissions)
def by廑email廑address(klass,email):
"一个类方法,可用于根据用户的电子邮件地址搜索用户,因为是唯一的。
"
session=dbsession()
返回session.query(klass).filter(klass.email==email).first()
用户名:
"一个类方法,允许根据用户的用户名属性搜索用户
。"
"
session=dbsession()
返回session.query(klass).filter(klass.user\u name==username).first()
=classmethod(按用户名)
def\u set\u password(self,password):
"使用配置中定义的加密算法动态加密密码"
"
"algorithm=config.get('authorize.hashmethod',none)
self.\u password=self.\u encrypt\u password(algorithm,password)
def\u get\u password(self):
"返回password
""返回self.\u password
def\u encrypt\u密码(self,algorithm,password):
"使用指定的算法散列给定密码。算法的有效值
为"md5"和"sha1"。所有其他算法值基本上都是不可操作的。""
哈希密码=password
如果是instance(password,unicode):
password bit=password.encode('utf-8')
否则:
password bit=password
如果"md5"==算法:
散列密码=md5.new(password bit).hexDigest()
elif"sha1"==算法:
散列密码=sha.new(password bit).hexDigest()
;todo:重新添加提供自己的hasing算法的可能性#在这里。。。只需获取真正的配置…
elif"custom"==算法:
无)(如果自定义加密路径:
=自定义加密(密码8位)
unicode):
散列密码=散列密码。decode('utf-8')
返回散列密码
def validate\u password(self,密码:
"根据现有凭据检查密码。
""
算法=config.get('authorize.hashmethod',none)
返回self.password==self.\u加密密码(算法,密码)
类权限(对象):
"确定每个组可以做什么的关系"
"传递
mapper(用户,用户表,
properties=dict(密码=用户表.c.password))
mapper(组,组表,
properties=dict(users=relation(user,
secondary=user_group_table,backref='groups'))
映射器(permission,permissions_table,
properties=dict(groups=relation(group,
secondary=group_permission_table,backref='permissions'))
-在控制器中添加以下导入。根文件::
from tgrepozewho import authorize
-向控制器添加以下方法。根:rootcontroller
类::
@expose('whotg.templates.about')
@authorize.require(authorize.has_permission('manage'))
仅定义管理权限(self,**kw):
返回dict(now=now,page='about')
@expose('whotg.templates.about')
@authorize.require(authorize.is_user('editor'))
仅定义编辑器用户(self,**kw):
返回dict(now=now,page='about')
@expose('whotg.templates.login')
def login(self,**kw):
come撸from=kw.get('come撸from','/')
返回dict(now=now,page='login',header=lambda*arg:none,
footer=lambda*arg:none,come廑from=come廑from)
-将以下模板作为"login.html"添加到项目的
"template s"目录中::
<;!doctype html public"-//w3c//dtd xhtml 1.0 transitional//en"
"http://www.w3.org/tr/xhtml l1/dtd/xhtml l1 transitional.dtd">;
<;html xmlns="http://www.w3.org/1999/xhtml"
XMLNs:Py="http://www. W3.org//x/5"& gt;
& l>;X:包括Hrff ="Mr.html"/Br/>< Br/> &
& Meta内容="text /html;字符集=UTF-8"http Adv="内容类型"Py:Posie="A'"/gt;
<;title>;登录表单<;title>;
<;head>;
<;body>;
<;表单操作="/登录处理程序?come嫒from=${come嫒from}method="post">;
登录:<;输入类型="text"name="login">;<;/input>;<;br/>;
密码:<;输入类型="password"name="password">;<;/input>;<;br/>;
<;输入类型="submit"name="submit"/>;
<;/form>;
<;/body>;
<;/html>;
-通过调整development.ini文件以正常方式设置数据库配置
-使用以下命令创建必要的表:
paster setup app development.ini
-在数据库中手动创建用户
-创建组(任何名称),以及名为"manage"的权限,将此权限链接到您刚刚创建的组,并将一个用户添加到您的组。
-创建另一个不在组中但名为"editor"的用户
-通过粘贴服务启动项目服务器::
paster server--reload development.ini
-访问http://localhost:8080/editor-user-u仅在浏览器中。您将看到登录表单。"right"
用户名/密码组合为"editor/editpass"(此用户具有
用户名"editor")。提交这组凭据将显示about页面。任何其他用户名/密码组合都将导致用户再次出现登录表单。请注意,
第一次获得凭据后,如果再次访问/editor_user_only页面,则不会要求您重新验证。通过访问http://localhost:8080/log out_handler强制注销。
-仅在浏览器中访问http://localhost:8080/manage_permission_。
您将看到登录表单。"右"
用户名/密码组合为"manager/managepass"(此用户具有管理权限)。提交这组
凭据将显示"关于"页。任何其他用户名/密码组合都将导致用户再次收到登录表单。请注意,如果您已经作为"编辑器"用户进行了身份验证,并且
您访问了/manage_permission_only页面,则您将注销
并要求您提供凭据(编辑器无法看到此页面)。注意
第一次获得凭据后,如果再次访问/manage_permission_only页面,则不会要求您重新验证。通过访问
http://localhost:8080/log out_handler强制注销。
使用
源包中的"python setup.py test"运行单元测试。
取决于repoze.who 0.8或更高版本。
尝试它
-将tg2安装到virtualenv中。
-通过"setup.py
install"将这个包安装到同一个virtualenv中。
-使用virtualenv的python创建一个tg2快速启动项目。
-in您的development.ini项目…
-在项目的config.middleware模块中,在"Custom Middleware here"下面添加以下内容:
dbsession)
-在模型中添加以下定义。
groups\u table=table('tg\u group',metadata,
column('group\u id',integer,primary\u key=true)、
column('group\u name',unicode(16),unique=true)、
column('display\u name',unicode(255)),
列('created',datetime,default=datetime.datetime.now)
用户表=表('tg_用户',元数据,
列('user_id',integer,primary_key=true),
列('user_name',unicode(16),unique=true),
列('email_address',unicode(255),unique=true),
列('display_name',unicode(255)),
列('password',unicode(40)),
列('created',datetime,default=datetime.datetime.now)
permissions_table=table('tg_permission',metadata,
列('permission_id',integer,primary_key=true),
列('权限名称',Unicode(16),唯一=真),
列('说明',Unicode(255))
user_group_table=table('tg_user_group',元数据,
列('user_id',整数,foreignkey('tg_user.user_id',
onupdate="cascade",ondelete="cascade"),
column('group_id',integer,foreignkey('tg_group.group_id',
onupdate="cascade",ondelete="cascade"))
group_permission_table=table('tg_group_permission',metadata,
column('group_id',integer,foreignkey('tg_group.group_id',
onupdate="cascade",ondelete="cascade"),
列('permission\u id',integer,foreignkey('tg\u permission.permission\u id',
onupdate="cascade",ondelete="cascade"))
)
可能需要其他
属性。
"
def repr(self):
return"<;user:email="%s",display name="%s">;"%(self.email地址,self.display名称)
def权限(self):
perms=set()
在self.groups中:
perms=perms set(g.permissions)
return perms
permissions=property(permissions)
def by廑email廑address(klass,email):
"一个类方法,可用于根据用户的电子邮件地址搜索用户,因为是唯一的。
"
session=dbsession()
返回session.query(klass).filter(klass.email==email).first()
用户名:
"一个类方法,允许根据用户的用户名属性搜索用户
。"
"
session=dbsession()
返回session.query(klass).filter(klass.user\u name==username).first()
=classmethod(按用户名)
def\u set\u password(self,password):
"使用配置中定义的加密算法动态加密密码"
"
"algorithm=config.get('authorize.hashmethod',none)
self.\u password=self.\u encrypt\u password(algorithm,password)
def\u get\u password(self):
"返回password
""返回self.\u password
def\u encrypt\u密码(self,algorithm,password):
"使用指定的算法散列给定密码。算法的有效值
为"md5"和"sha1"。所有其他算法值基本上都是不可操作的。""
哈希密码=password
如果是instance(password,unicode):
password bit=password.encode('utf-8')
否则:
password bit=password
如果"md5"==算法:
散列密码=md5.new(password bit).hexDigest()
elif"sha1"==算法:
散列密码=sha.new(password bit).hexDigest()
;todo:重新添加提供自己的hasing算法的可能性#在这里。。。只需获取真正的配置…
elif"custom"==算法:
无)(如果自定义加密路径:
=自定义加密(密码8位)
unicode):
散列密码=散列密码。decode('utf-8')
返回散列密码
def validate\u password(self,密码:
"根据现有凭据检查密码。
""
算法=config.get('authorize.hashmethod',none)
返回self.password==self.\u加密密码(算法,密码)
类权限(对象):
"确定每个组可以做什么的关系"
"传递
mapper(用户,用户表,
properties=dict(密码=用户表.c.password))
mapper(组,组表,
properties=dict(users=relation(user,
secondary=user_group_table,backref='groups'))
映射器(permission,permissions_table,
properties=dict(groups=relation(group,
secondary=group_permission_table,backref='permissions'))
-在控制器中添加以下导入。根文件::
from tgrepozewho import authorize
-向控制器添加以下方法。根:rootcontroller
类::
@expose('whotg.templates.about')
@authorize.require(authorize.has_permission('manage'))
仅定义管理权限(self,**kw):
返回dict(now=now,page='about')
@expose('whotg.templates.about')
@authorize.require(authorize.is_user('editor'))
仅定义编辑器用户(self,**kw):
返回dict(now=now,page='about')
@expose('whotg.templates.login')
def login(self,**kw):
come撸from=kw.get('come撸from','/')
返回dict(now=now,page='login',header=lambda*arg:none,
footer=lambda*arg:none,come廑from=come廑from)
-将以下模板作为"login.html"添加到项目的
"template s"目录中::
<;!doctype html public"-//w3c//dtd xhtml 1.0 transitional//en"
"http://www.w3.org/tr/xhtml l1/dtd/xhtml l1 transitional.dtd">;
<;html xmlns="http://www.w3.org/1999/xhtml"
XMLNs:Py="http://www. W3.org//x/5"& gt;
& l>;X:包括Hrff ="Mr.html"/Br/>< Br/> &
& Meta内容="text /html;字符集=UTF-8"http Adv="内容类型"Py:Posie="A'"/gt;
<;title>;登录表单<;title>;
<;head>;
<;body>;
<;表单操作="/登录处理程序?come嫒from=${come嫒from}method="post">;
登录:<;输入类型="text"name="login">;<;/input>;<;br/>;
密码:<;输入类型="password"name="password">;<;/input>;<;br/>;
<;输入类型="submit"name="submit"/>;
<;/form>;
<;/body>;
<;/html>;
-通过调整development.ini文件以正常方式设置数据库配置
-使用以下命令创建必要的表:
paster setup app development.ini
-在数据库中手动创建用户
-创建组(任何名称),以及名为"manage"的权限,将此权限链接到您刚刚创建的组,并将一个用户添加到您的组。
-创建另一个不在组中但名为"editor"的用户
-通过粘贴服务启动项目服务器::
paster server--reload development.ini
-访问http://localhost:8080/editor-user-u仅在浏览器中。您将看到登录表单。"right"
用户名/密码组合为"editor/editpass"(此用户具有
用户名"editor")。提交这组凭据将显示about页面。任何其他用户名/密码组合都将导致用户再次出现登录表单。请注意,
第一次获得凭据后,如果再次访问/editor_user_only页面,则不会要求您重新验证。通过访问http://localhost:8080/log out_handler强制注销。
-仅在浏览器中访问http://localhost:8080/manage_permission_。
您将看到登录表单。"右"
用户名/密码组合为"manager/managepass"(此用户具有管理权限)。提交这组
凭据将显示"关于"页。任何其他用户名/密码组合都将导致用户再次收到登录表单。请注意,如果您已经作为"编辑器"用户进行了身份验证,并且
您访问了/manage_permission_only页面,则您将注销
并要求您提供凭据(编辑器无法看到此页面)。注意
第一次获得凭据后,如果再次访问/manage_permission_only页面,则不会要求您重新验证。通过访问
http://localhost:8080/log out_handler强制注销。
使用
源包中的"python setup.py test"运行单元测试。