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')