今年的天气特别的冷,于是,继续缓慢更新。

Django 其实有自己的权限认证组件,可以拿来用,其实本身代码量也不多,还是自己写吧。

新建了一个functions文件夹用于存放各种功能文件:

说说登录的原理吧,企业中一般使用AD作为认证源,微软域服务本身只有Windows系统可用,但非Windows可以使用ldap协议来进行认证,这里需要用到的库ladp3,在functions文件夹中新建publicldaplogin.py文件。功能代码如下:

from ldap3 import Server,Connection,SIMPLE,SYNC,ALL,SASL,NTLM,SUBTREE,ALL_ATTRIBUTES,ALL_OPERATIONAL_ATTRIBUTES
import times = Server('10.210.12.17',get_info=ALL)def login(username,password):c = Connection(s, user='head.yst%s'%username, password=password, authentication=NTLM)if not c.bind():result = {'result':'False'}return resultelse:c.search(search_base='dc=head,dc=yst',search_filter='(anr={})'.format(username),search_scope=SUBTREE,attributes=['displayName','title'],#  attributes=ALL_ATTRIBUTES)result = {'result':'Success','username':username,'fullname':str(c.entries[0]).split('n')[1].split(':')[1].lstrip(),'logintime':time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))}return result

代码末尾加上print(login('xcwang','password123'))我们来运行脚本,xcwang和password123对应的正是ad的用户名密码,得到以下结果:

{'result': 'Success', 'username': 'xcwang', 'fullname': '王小川', 'logintime': '2020-10-30 10:00:08'}

功能测试正常,删除最后一行,登录功能组件就写完了,

但是需要在平台中使用起来,还需要一些工作,登录脚本只是满足了去验证用户身份的功能,用户成功登录后,我们应该设置一个令牌给到用户,拿到令牌的用户,可以在系统中进行各种被允许的操作。

所以,我们需要一个给用户发令牌的功能,functions中新建public_token_auth.py

import time
import jwt#用户通过此脚本获取到token
def get_token(username, key):token_dict={'time':time.time(),'name':username}headers ={'alg':"HS256"}jwt_token=jwt.encode(token_dict,key,algorithm="HS256",headers=headers).decode()return jwt_token#对用户的token进行认证,确保是我们之前发出去的
def dec_token(token_key,key):try:data = jwt.decode(token_key, key , algorithms=['HS256'])['name']return dataexcept Exception as e:return e

验证token功能呢,如下:

末尾加上print(get_token('abc','123')),然后运行
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0aW1lIjoxNjA0MDI0NjkzLjQzNDE2NiwibmFtZSI6ImFiYyJ9.0GSfXloR9Y7O9OD3wD-33ErotX58U13_dCOJ7BcMe_8将末尾的print改成print(dec_token('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0aW1lIjoxNjA0MDI0NjkzLjQzNDE2NiwibmFtZSI6ImFiYyJ9.0GSfXloR9Y7O9OD3wD-33ErotX58U13_dCOJ7BcMe_8','123'))
再次运行,得到的结果为abc即可

验证完成后记得删除多余代码,接着回到views.py,

from django.shortcuts import render,redirect
from functions import public_ldap_login,public_token_authdef login(request):#token的获取使用key'abcd.com.cn'if request.method == 'POST':#获取用户POST上来的用户名和密码un = request.POST.get('username')pd = request.POST.get('password')#判断用户名密码为非空,如果为空,则返回消息和login页面if un == '' or pd == '':res = render(request, 'login.html', context={'result':'用户名密码不能为空!'})return res#获取登录结果login_result = public_ldap_login.login(un,pd)#如果登录结果为false则返回页面和登录失败消息。if login_result['result'] == 'False':res = render(request, 'login.html', context={'result':'登陆失败,用户名密码错误,请检查!'})return res#如果登录成功则执行以下操作else:#如果session key中包含'login_from‘字段,则表示用户是从其它页面跳转到login的if 'login_from' in request.session.keys():#则为用户准备以下资源:1、跳转到login_from定义的页面,设置token,username,fullname,logintime的cookieres = redirect(request.session['login_from'])res.set_cookie('token',public_token_auth.get_token(un,'abcd.com.cn'),max_age=36000)res.set_cookie('username', un,max_age=36000)res.set_cookie('fullname',login_result['fullname'],max_age=36000)res.set_cookie('logintime',login_result['logintime'],max_age=36000)res.set_cookie('result','Success',max_age=36000)return res#如果session ky中不包含login_from字段,则直接返回login.html,并要求重新登录else:return render(request,'login.html')#如果使用非POST非GET的请求方法,则直接返回login页面,要求强制登录else:return render(request,'login.html')#下面定义个装饰器函数,一方面,实现登录逻辑,另外其它页面函数也方便调用。
def login_auth(fouc):def wrapper(request,*args,**kwargs):cookie_get = request.COOKIES #获取用户cookieuser_path = request.path #获取用户访问的path,非常重要!!#如果未曾认证,或cookie不完整,则直接重定向到login页面if 'token' not in cookie_get or 'username' not in cookie_get or cookie_get['username'] != public_token_auth.dec_token(cookie_get['token'],'abcd.com.cn') and user_path != '/login/': #设置request.session['login_from']为user_path!!request.session['login_from'] = user_path  return redirect('/login/')  # 此时用户的request.session中已经包含了user_path,登录成功后,可直接跳转至登录之前的页面#如果用户跳转到login页面之前的页面就是/login/,则直接返回login.htmlelif user_path == '/login/':request.session['login_from'] = '/'return render(request,'login.html')else:return fouc(request,*args,**kwargs)return wrapper@login_auth
def index(request):return render(request,'index.html')@login_auth
def infosearch(request):return render(request,'infosearch.html')

结果验证:

打开http://127.0.0.1,将会被重定向至login页面,输入正确的ad用户名密码后,将直接跳转至主页,输入错误的用户名密码或不输入直接点击登录,会有相应的错误提示。

删除cookie直接尝试访问http://127.0.0.1/infosearch 会被重定向至登录页面,输入正确的用户名密码后,自动跳转至infosearch页面。

再来梳理一下,登录组件逻辑:

1、尝试获取用户cookie和访问路径;
2、如果用户未认证,则重定向到login函数进行处理(处理步骤在下面);
3、如果用户的访问路径为‘/login’,则直接返回login.html页面
4、如果2、3都没有匹配到,则正常执行用户的请求。

login函数处理用户请求逻辑:
如果用户是通过POST发送登录信息,则处理用户登录,并将结果写入到用户cookie;
其它情况一律返回login.html,要求登录。

今天先到这里,后面将继续更新。

登录页面html代码_【网络自动化平台开发】—— 登录组件相关推荐

  1. java登录注册升级代码_【升级版】Java 登录,注册,传数据到后台小案例

    1.项目结构 2.项目所用文件 1)jar包  ojdbc5.jar     2)js     jquery-2.1.0.js , jquery.validate.min.js       3)css ...

  2. html登录界面设计代码_最简洁实现Github登录的JS代码示例

    本文源码地址:https://github.com/Spring-Security-China/oauth2-client-login-js-github 大纲 概述 实现思路分析 在Github官网 ...

  3. [4G5G专题-62]:架构 - 开放的网络自动化平台ONAP(Open Network Automation Platform)

    目录 第1章 什么是开放的网络自动化平台ONAP 1.1 什么是ONAP? 1.2 什么是的网络自动化平台? 1.3 ONAP的动机与背景 1.4 ONAP的底层支撑技术 1.5 ONAP的前世 1. ...

  4. 思科网络基础课件_网络自动化认证,你选对了吗?

    网络越来越依赖于软件,以及依靠工具来自动执行过往需要手动处理的功能.面对这种转型,网络工程师和管理人员应考虑获得自动化技能,而获取网络自动化认证可能是学习和发展这些技能的最佳方法. 现在网络自动化市场 ...

  5. 前端直接访问登录页面报错_如何实现登录、URL和页面按钮的访问控制

    作者:社会主义接班人 http://cnblogs.com/5ishare/p/10461073.html 用户权限管理一般是对用户页面.按钮的访问权限管理.Shiro框架是一个强大且易用的Java安 ...

  6. php制作登录页面的过程_一个用Html制作的漂亮登录页面

    这篇文章主要为大家详细介绍了Html制作简单而漂亮的登录页面具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 先来看看样子. html源码: Login Login 登录 css代码: CS ...

  7. php mysql登陆页面完整代码_求助:PHP实现登陆注册的代码是什么啊(主要是数据库那块)?...

    思路: 注册: 获取前台表单数据->数据库连接->判断数据是否存在,存在输出提示,不存在则向数据库插入表单传来的值->如果sql执行失败输出错误,成功功输出注册成功 登陆: 获取前台 ...

  8. python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...

    热门推荐 html/css 一.escape和它们不是同一类简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读.编码之后的... 标签: 0 ...

  9. php登录控制实验报告_一个php实现用户登录的实例代码

    了解如何创建一个简单的登录系统,php + mysql的脚本,这个教程代码很容易实现,教你一步一步实现. 在本教程中,我们创建3个PHP文件来测试我们的代码. 1 main_login.php 2 c ...

最新文章

  1. 原创 几个免费下载原版图书的网站
  2. Git 2.25.0 发布,新特性:部分 clone 与稀疏 checkout
  3. 毕业后的五年拉开大家差距的原因在哪里?
  4. 【开源】.Net Api开放接口文档网站
  5. Xcode 7 App Transport Security has blocked a cleartext HTTP 报错解决办法
  6. 负载均衡集群HAProxy讲解篇
  7. linux+tux游戏,Linux吉祥物游戏SuperTux 0.5.0版发布 类《超级马里奥兄弟》
  8. install opencv 4.1.1 from source on windows,在其他项目中用cmake去引用
  9. 性能优化篇 - Performance(工具 api)
  10. matlab画图不显示中文_[过时] [LaTeX 使用] 升级 macOS 10.15 后 ctex 文档不显示中文的临时方案...
  11. HEVC播放器出炉,迅雷看看支持H.265
  12. android wifi 抓sniffer log
  13. RPC调用和HTTP调用的区别
  14. Visio Professional 2019 激活方法详解
  15. wifi可以连接但是上不了网该怎么解决?
  16. Android布局优化之TextView、ImageView合二为一
  17. 让机器耳濡目染:MIT提出跨模态机器学习模型
  18. VS2019编译python解释器源码及学习方法
  19. 股票每日复盘都应该做什么,需要从哪些方面复盘?
  20. 2021年危险化学品生产单位安全生产管理人员考试及危险化学品生产单位安全生产管理人员考试资料

热门文章

  1. 基于暗通道优先算法的去雾应用Matlab
  2. log4net在winform中release后不工作的原因
  3. REST WebServices学习
  4. sql语句的type='u'问题
  5. zcmu-1783(01字典树)
  6. c/c++反混淆方法
  7. 【译】Privacy and machine learning: two unexpected allies
  8. Tensorflow Lite 编译
  9. SPV、SPV节点和SPV钱包
  10. 根据”so劫持”过360加固详细分析