CAS python 客户端登录分析

一。通过url配置让访问请求转到cas验证:
url(r’^login/$’, cas.views.login’cas.views.login’, name=’login’),
二。cas.views.login 方法有两方面的作用
1.若请求中没有携带ticket,则转到 CAS login URL
2.若请求中带了ticket,则验证CAS ticket的有效性

对于第一种情况,请求中没有携带ticket:
会拼凑出向CAS发送登录请求的url:
这里写图片描述
这里写图片描述
CAS端处理完请求后会返回ticket,然后在根据请求中的service返回到之前请求的url,然后到第2点

这里,我着重在第2点讲述:
若请求中携带了ticket,则会验证ticket的有效性,并对user进行鉴权
如源码:
在cas.views.login方法中:

if ticket:
    user = auth.authenticate(ticket=ticket, service=service)

这个auth.authenticate方法会调用在settings中配置的backend

AUTHENTICATION_BACKENDS = (
    'cas.backends.CASBackend',
)

如源码:

def authenticate(**credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backends(return_tuples=True):
        try:
            inspect.getcallargs(backend.authenticate, **credentials)
        except TypeError:
            # This backend doesn't accept these credentials as arguments. Try the next one.
            continue

        try:
            user = backend.authenticate(**credentials)
    …略…

接下来的工作便交给到CASBackend.authenticate的方法对ticke进行验证
这个方法最终会调用_internal_verify_cas(ticket, service, suffix)这个方法
CASBackend.authenticate方法是基于xml验证CAS 2.0 和 CAS 3.0版本 ticket的,验证成功会返回一个username,验证失败则返回failure
验证方式:
_internal_verify_cas方法通过拼凑url方式拼凑一个url向CAS服务器发送一个请求,该请求会返回一个带有xml格式数据的验证信息的jsp页面(若验证成功,xml里会包含username节点的数据)
拼凑的url:url = (urljoin(settings.CAS_SERVER_URL, suffix) + '?' + urlencode(params))
这里写图片描述
该部分源码:

def _internal_verify_cas(ticket, service, suffix):
    """Verifies CAS 2.0 and 3.0 XML-based authentication ticket.

    Returns username on success and None on failure.
    """

    params = {'ticket': ticket, 'service': service}
    if settings.CAS_PROXY_CALLBACK:
        params['pgtUrl'] = settings.CAS_PROXY_CALLBACK

    url = (urljoin(settings.CAS_SERVER_URL, suffix) + '?' +
           urlencode(params))

    page = urlopen(url)

    username = None

    try:
        response = page.read()
        tree = ElementTree.fromstring(response)
        document = minidom.parseString(response)

        if tree[0].tag.endswith('authenticationSuccess'):
            if settings.CAS_RESPONSE_CALLBACKS:
                cas_response_callbacks(tree)

            username = tree[0][0].text
…略…
else:
    failure = document.getElementsByTagName('cas:authenticationFailure')
    if failure:
        logger.warn('Authentication failed from CAS server: %s',
                    failure[0].firstChild.nodeValue)

至此,若验证成功,则可以将username返回
Username返回到CASBackend.authenticate方法:username = _verify(ticket, service)
获得这个username会做判断:
1. 若已存在这个username的user,则查询出来返回这个user
2. 若不存在这个username的user,则创建这个user并返回
到此时,便验证成功了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值