Quantum的权限认证(1)

该篇博客探讨了Quantum系统中权限认证的过程,主要是在用户身份验证后,如何验证用户是否有执行特定操作的权限。这个过程涉及到对身份认证信息的封装,并在如get_port等实际操作时进行验证。配置文件api-paste.ini中设定了相关策略,将权限认证融入到每个操作的细节中。
摘要由CSDN通过智能技术生成

本文地址:http://blog.csdn.net/spch2008/article/details/9698453


在身份认证结束后,会进行权限认证,即验证用户是否有做此操作的权限。实际上,这一步将身份认证提供的信息

进行一些包装,在后续具体操作(例如get_port等)的过程中进行验证。


api-paste.ini中

[composite:quantumapi_v2_0]
use = call:quantum.auth:pipeline_factory
noauth = extensions quantumapiapp_v2_0
keystone = authtoken keystonecontext extensions quantumapiapp_v2_0

[filter:keystonecontext]
paste.filter_factory = quantum.auth:QuantumKeystoneContext.factory
从api-paste.ini配置文档中可知,权限认证转向quantum.auth:QuantumKeystoneContext.factory创建一个QuantumKeystoneContext对象。

@webob.dec.wsgify
def __call__(self, req):
    user_id = req.headers.get('X_USER_ID', req.headers.get('X_USER'))
    tenant_id = req.headers.get('X_TENANT_ID', req.headers.get('X_TENANT'))
    roles = [r.strip() for r in req.headers.get('X_ROLE', '').split(',')]

    ctx = context.Context(user_id, tenant_id, roles=roles)
	
    req.environ['quantum.context'] = ctx

    return self.application

将user_id, tenant_id, roles信息从信息头中抽取出来,创建一个Context对象,然后将该对象加入信息头,供后续权限认证使用。

class ContextBase(common_context.RequestContext):
    """Security context and request information.

    Represents the user taking a given action within the system.

    """

    def __init__(self, user_id, tenant_id, is_admin=None, read_deleted="no",
                 roles=None, timestamp=None, **kwargs):
        super(ContextBase, self).__init__(user=user_id, tenant=tenant_id,
                                          is_admin=is_admin)
    

    def to_dict(self):
        return {'user_id': self.user_id,
                'tenant_id': self.tenant_id,
                'project_id': self.project_id,
                'is_admin': self.is_admin,
                'read_deleted': self.read_deleted,
                'roles': self.roles,
                'timestamp': str(self.timestamp)}


class Context(ContextBase):
    @property
    def session(self):
        if self._session is None:
            self._session = db_api.get_session()
        return self._session

有两个方法值得注意:一个是session,获得一个数据库连接,一个是to_dict将相应信息转换成一个字典。

这样,准备工作就完成了,权限认证推迟到每一个操作中去做。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值