Answers
django实现登录原理
- django自带auth模块,可实现用户验证登录
- 当用户登录了网站,django通过两个中间键验证用户登录:
- django.contrib.sessions.middleware.SessionMiddleware 和
- django.contrib.auth.middleware.AuthenticationMiddleware
具体流程
- 当用户登录成功,服务器生成一个sessionid,保存于数据库,并写到用户浏览器cookie中
- 用户再次访问,首先中间键SessionMiddleware会读取这个名为sessionid的cookie,根据该值查询数据库,获取用户id,生成一个session对象
- 然后中间建AuthenticationMiddleware根据session对象获取用户user对象,保存成request.user
- 当处理对应的视图函数时,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中
具体操作
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', )
创建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
关于openid
OpenID 是一个去中心化的网上身份认证系统。对于支持OpenID的网站,用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为OpenID身份提供者(identity provider, IdP)的网站上注册
详细描述可见:http://zh.wikipedia.org/wiki/OpenID
基本原理与操作
在openid服务器上注册一个openid,会生成一个url,这个就是你进行认证的用户名,在一些支持openid的网站上登录时,就像一个统一的接口,你不要注册,只需要输入你的openid用户名,即你的url,然后网站会跳转到你的openid服务器上进行身份认证,认证通过后,你成功登录该网站
操作实例
- 首先在openid服务器上注册一个openid,如:http://openid.org.cn/register,我注册的openid是:http://icgoo.openid.org.cn/
- 在支持openid的网站上登录,如:http://www.lepu.com/login.php?needlogin=1&from=%2Fmy%2F
在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登录.
这里列举一些参考: