多个django网站如何共用一个认证系统?


我们公司的多个网站都是基于django的,现在所有的网站都是使用各自的登录和认证系统。计划打通各个网站,可以使用统一认证。请问该如何实施?

开发 统一认证 多网站认证 django

————囧rz 10 years, 6 months ago

django实现登录原理

  • django自带auth模块,可实现用户验证登录
  • 当用户登录了网站,django通过两个中间键验证用户登录:
  • django.contrib.sessions.middleware.SessionMiddleware 和
  • django.contrib.auth.middleware.AuthenticationMiddleware

具体流程

  1. 当用户登录成功,服务器生成一个sessionid,保存于数据库,并写到用户浏览器cookie中
  2. 用户再次访问,首先中间键SessionMiddleware会读取这个名为sessionid的cookie,根据该值查询数据库,获取用户id,生成一个session对象
  3. 然后中间建AuthenticationMiddleware根据session对象获取用户user对象,保存成request.user
  4. 当处理对应的视图函数时,request中就保存的相应的user对象,可判断是否登录

AuthenticationMiddleware, 文件:django/contrib/auth/middleware.py

from django.contrib import auth  
from django.core.exceptions import ImproperlyConfigured  

class LazyUser(object):  
    def __get__(self, request, obj_type=None):  
        if not hasattr(request, '_cached_user'):  
            from django.contrib.auth import get_user  
            request._cached_user = get_user(request)  
        return request._cached_user  

class AuthenticationMiddleware(object):  
    def process_request(self, request):  
        assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."  
        request.__class__.user = LazyUser()  
        return None

实现双系统用户验证原理

要实现双系统用户验证,就不按正常的django验证流程,自己重写一个登录验证的中间件

具体实现原理

  • 用户请求访问系统A,系统A中间件同样首先读取相应的cookie值。得到cookie值后,不是像正常的流程一样查询数据库获取user对象
  • 而且将该值发送给系统B,由系统B验证,如果系统B验证通过,则把该用户的username发送过来,如果没通过,则发送空值
  • 系统A获取username后,去自己的authuser表中查找,如果没有,则创建一个user对象(getor_create) 最后将user对象保存于request.user中

具体操作

  1. setting文件中中间件'django.contrib.auth.middleware.AuthenticationMiddleware', 改成自己的中间件'myauth.middleware.AuthenticationMiddleware',

    MIDDLEWARE_CLASSES = (  
        'django.middleware.common.CommonMiddleware',  
        'django.contrib.sessions.middleware.SessionMiddleware',  
        'django.middleware.csrf.CsrfViewMiddleware',  
        #'django.contrib.auth.middleware.AuthenticationMiddleware',  
        'myauth.middleware.AuthenticationMiddleware',  
        'django.contrib.messages.middleware.MessageMiddleware',  
    )  
  2. 创建app myauth, 并有文件middleware.p有(myauth/middleware.py)

    from django.conf import settings  
    from django.contrib.auth.models import AnonymousUser, User  
    
    class LazyUser(object):  
        def __get__(self, request, obj_type=None):  
            if not hasattr(request, '_cached_user'):  
                #from django.contrib.auth import get_user  
                request._cached_user = get_user(request)  
            return request._cached_user  
    
    
    class AuthenticationMiddleware(object):  
        def process_request(self, request):  
            assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."  
            request.__class__.user = LazyUser()  
    
    
    def get_user(request):  
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)  
        user_dict = get_user_from_icnet(session_key)  
        if user_dict:  
            user, iscreate = User.objects.get_or_create(username=user_dict['username'])  
        else:  
            user = AnonymousUser()  
        return user  
    
    def get_user_from_icnet(session_key):  
        user_dict = {'username': 'test'}  
        return user_dict  
喜多嶋時透 answered 10 years, 2 months ago

关于openid

OpenID 是一个去中心化的网上身份认证系统。对于支持OpenID的网站,用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为OpenID身份提供者(identity provider, IdP)的网站上注册

详细描述可见:http://zh.wikipedia.org/wiki/OpenID

基本原理与操作

在openid服务器上注册一个openid,会生成一个url,这个就是你进行认证的用户名,在一些支持openid的网站上登录时,就像一个统一的接口,你不要注册,只需要输入你的openid用户名,即你的url,然后网站会跳转到你的openid服务器上进行身份认证,认证通过后,你成功登录该网站

操作实例

  1. 首先在openid服务器上注册一个openid,如:http://openid.org.cn/register,我注册的openid是:http://icgoo.openid.org.cn/
  2. 在支持openid的网站上登录,如:http://www.lepu.com/login.php?needlogin=1&from=%2Fmy%2F
  3. 在openid地址上填入我的openid,如 http://icgoo.openid.org.cn/ 网站会跳转的openid服务器上进行身份认证

    django-openid, 文档地址:http://code.google.com/p/django-openid

该项目主要是让你的django网站支持openid登录

操作

1.下载django_openidconsumer,并加入到项目下

svn co http://django-openid.googlecode.com/svn/trunk/django_openidconsumer django_openidconsumer

2. settings.py中 INSTALLEDAPPS 加入 djangoopenidconsumer. 3. manage.py syncdb 创建数据库. 4. settings.py中 MIDDLEWARECLASSES 加入 djangoopenidconsumer.middleware.OpenIDMiddleware. 5. url配置中加入

(r'^openid/$', 'django_openidconsumer.views.begin'),
(r'^openid/complete/$', 'django_openidconsumer.views.complete'),
(r'^openid/signout/$', 'django_openidconsumer.views.signout'),

6. 然后, 你通过你的网站地址http://example.com/openid/ 用OpenID登录.

逆袭的那个谁 answered 10 years, 2 months ago


Your Answer