OpenID + Authkit และ Pylons แบบมี Admin กับ User อื่นๆ

หลังจากที่โพสไปคราวก่อน ก็ลองใช้ OpenID กับ Authkit และ Pylons ได้แล้ว ใน app ชื่อ topenid แต่ว่าผมก็ยังอยากจะแยกระหว่าง admin กับ user อื่นๆ ก็เลยเขียน code เพิ่มอีกหน่อย เริ่มจาก development.ini เพิ่มบรรทัดนี้เข้าไป

topenid.admins = http://xxxx.myopenid.com/ https://me.yahoo.com/xxxxyyyy

เพื่อบอกว่า admins เป็นใครบ้าง แต่พอดีเป็นแนว openid ก็บอกไปแบบนี้ จากนั้นก็เข้าไปแก้ใน controller แบบนี้

import logging

from pylons import request, response, session, tmpl_context as c
from pylons import config
from pylons.controllers.util import abort, redirect_to
from authkit.permissions import RemoteUser
from authkit.authorize.pylons_adaptors import authorize
from authkit.permissions import RequestPermission

from topenid.lib.base import BaseController, render

log = logging.getLogger(__name__)


# class Admin นี้เป็นตัว check permission ว่าเป็น Admin หรือเปล่า
# ผมว่าน่าแยกอีกไฟล์แต่ขี้เกียจ

from authkit.authorize import NotAuthenticatedError
import urlparse
class Admin(RequestPermission):
    def __init__(self):
        if 'topenid.admins' not in config:
            raise RuntimeError, 'Require topenid.admins'
        self.users = config['topenid.admins'].split()

    def check(self, app, environ, start_response):
        if 'REMOTE_USER' not in environ:
             raise NotAuthenticatedError('Not Authenticated')
        if urlparse.urldefrag(environ['REMOTE_USER'])[0] not in self.users:
             raise NotAuthenticatedError('Not Authenticated')
        return app(environ, start_response)

class AuthController(BaseController):

    # แบบนี้ใครก็เข้าได้
    def index(self):
        return 'Hello World'

    @authorize(Admin())  # ให้เฉพาะ admin เข้า
    def test2(self):
        return 'test'

    @authorize(RemoteUser())   # ใครที่ sign-in ก็เข้าได้
    def test(self):
        return 'test'

    def signout(self):
        return 'signout'

    def signin(self):
        return 'signed in'

    def env1(self):
        return request.environ.get('REMOTE_USER')
        #return config.get('topenid.admins')[0]

ง่วงมาก Zzzz …

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s