TurboGears - การอนุญาตและการรับรองความถูกต้อง
แอปพลิเคชัน TurboGears ถูกสร้างขึ้นโดยตัวเลือกการเริ่มต้นอย่างรวดเร็วและการตั้งค่าแอปของชุดเครื่องมือกระปุกเกียร์ซึ่งเปิดใช้งานการอนุญาตและการรับรองความถูกต้องตามค่าเริ่มต้น โมเดลที่ประกาศใน auth.py ได้รับการตั้งค่าและเริ่มต้นตามค่าที่กำหนดใน bootstrap.py
โมเดลต่อไปนี้ถูกประกาศใน auth.py -
รูปแบบผู้ใช้
โมเดลผู้ใช้ประกอบด้วยการออกแบบตาราง tg_user ตารางนี้ใช้โดยแพ็คเกจ repose.who แพ็คเกจ repose.who นี้เป็นไลบรารีการพิสูจน์ตัวตนที่มีประสิทธิภาพและขยายได้สำหรับแอ็พพลิเคชัน WSGI โครงสร้างของรูปแบบผู้ใช้มีดังนี้ -
class User(DeclarativeBase):
"""
__tablename__ = 'tg_user'
user_id = Column(Integer, autoincrement = True, primary_key=True)
user_name = Column(Unicode(16), unique = True, nullable = False)
email_address = Column(Unicode(255), unique = True,nullable=False)
display_name = Column(Unicode(255))
_password = Column('password', Unicode(128))
created = Column(DateTime, default = datetime.now)
โมเดลกลุ่มนี้ประกอบด้วยตาราง tg_group นิยาม คำจำกัดความได้รับใน auth.py ดังนี้ -
class Group(DeclarativeBase):
__tablename__ = 'tg_group'
group_id = Column(Integer, autoincrement = True,primary_key = True)
group_name = Column(Unicode(16),unique = True,nullable = False)
display_name = Column(Unicode(255))
created = Column(DateTime, default = datetime.now)
นอกจากนี้ยังมีการตั้งค่าการอนุญาตโมเดลอื่นซึ่งมีข้อกำหนดสิทธิ์
class Permission(DeclarativeBase):
__tablename__ = 'tg_permission'
permission_id = Column(Integer,autoincrement = True,primary_key = True)
permission_name = Column(Unicode(63), unique = True, nullable = False)
description = Column(Unicode(255))
ในขณะตั้งค่าโมเดลข้อมูลต่อไปนี้จะถูกเพิ่มในตารางเหล่านี้ -
u = model.User()
u.user_name = 'manager'
u.display_name = 'Example manager'
u.email_address = '[email protected]'
u.password = 'managepass'
model.DBSession.add(u)
g = model.Group()
g.group_name = 'managers'
g.display_name = 'Managers Group'
g.users.append(u)
model.DBSession.add(g)
p = model.Permission()
p.permission_name = 'manage'
p.description = 'This permission gives an administrative right'
p.groups.append(g)
model.DBSession.add(p)
u1 = model.User()
u1.user_name = 'editor'
u1.display_name = 'Example editor'
u1.email_address = '[email protected]'
u1.password = 'editpass'
model.DBSession.add(u1)
แบบจำลองเพรดิเคต
โมดูลเพรดิเคตในแพ็กเกจ tg มีคำจำกัดความสำหรับตัวตรวจสอบเพรดิเคต เพรดิเคตเป็นเงื่อนไขที่ต้องปฏิบัติตามเพื่อให้ผู้ใช้สามารถเข้าถึงแหล่งที่ร้องขอได้ เพรดิเคตหรือเงื่อนไขดังกล่าวอาจประกอบด้วยเพรดิเคตมากกว่านี้ซึ่งเรียกว่าเพรดิเคตแบบผสม ตัวควบคุมการดำเนินการหรือตัวควบคุมอาจมีเพียงเพรดิเคตเดียวไม่ว่าจะเป็นแบบเดี่ยวหรือแบบผสม
หากผู้ใช้ไม่ได้เข้าสู่ระบบหรือไม่มีสิทธิ์ที่เหมาะสมตัวตรวจสอบเพรดิเคตนี้จะพ่น 401 (HTTP Unauthorized) ซึ่งถูกจับโดย repoze ซึ่งมิดเดิลแวร์เพื่อแสดงหน้าล็อกอินเพื่อให้ผู้ใช้ล็อกอินและเปลี่ยนเส้นทาง ผู้ใช้กลับไปยังหน้าที่ถูกต้องเมื่อดำเนินการเสร็จสิ้น
เงื่อนไขหรือเพรดิเคตที่แตกต่างกันที่กำหนดไว้ในโมดูล tg.predicates คือ -
ซีเนียร์ | tg.predicates โมดูลและคำอธิบาย |
---|---|
1 | All ตรวจสอบว่าตรงตามเพรดิเคตทั้งหมดที่ระบุไว้หรือไม่ |
2 | Any ตรวจสอบว่าตรงตามเพรดิเคตที่ระบุอย่างน้อยหนึ่งรายการหรือไม่ |
3 | is_user ตรวจสอบว่าชื่อผู้ใช้ของผู้ใช้ที่ได้รับการรับรองความถูกต้องเป็นชื่อที่ระบุ |
4 | in_group ตรวจสอบว่าผู้ใช้อยู่ในกลุ่มใดกลุ่มหนึ่ง |
5 | in_all_groups ตรวจสอบว่าผู้ใช้อยู่ในกลุ่มที่ระบุทั้งหมด |
6 | in_any_group ตรวจสอบว่าผู้ใช้อยู่ในกลุ่มที่ระบุอย่างน้อยหนึ่งกลุ่ม |
7 | is_anonymous ตรวจสอบว่าผู้ใช้ปัจจุบันไม่ระบุชื่อ |
8 | has_permission ตรวจสอบว่าผู้ใช้ปัจจุบันมีสิทธิ์ที่ระบุ |
9 | has_all_permissions ตรวจสอบว่าผู้ใช้ปัจจุบันได้รับสิทธิ์ทั้งหมดที่ระบุไว้ |
10 | has_any_permission ตรวจสอบว่าผู้ใช้มีสิทธิ์ที่ระบุไว้อย่างน้อยหนึ่งรายการ |
ตัวอย่างเช่นหากคุณมีเพรดิเคตซึ่งก็คือ grant access user belonging to customers groupจากนั้นคุณสามารถใช้ตัวตรวจสอบเพรดิเคตในตัวต่อไปนี้ -
from tg.predicates import in_group
p in_group(‘customers’)
ตัวตรวจสอบเพรดิเคตต่อไปนี้จะให้สิทธิ์การเข้าถึงแก่ผู้ใช้ "root" หรือใครก็ตามที่มีสิทธิ์ "จัดการ" -
from tg.predicates import Any, is_user, has_permission
p = Any(is_user('root'), has_permission('manage'),
sg = 'Only administrators can remove blog posts')