编程 12

Keystone初入门知识【编程】,编写可供用户查询的员工信息表

要求:

2.员工信息表文件内容:

此表设计当真简介明了,无差别对待员工和顾客,等等,这样怎么体现我们员工的优越性。得做点什么区分一下我们的员工和顾客。为了方便管理,最好有一张区别身份的表,就叫做tenant吧,nova啊,glance统统塞到service好了,留一个admin是我日后要找的管理员。
编程 1

编写可供用户查询的员工信息表

 5.登陆成功后查询员工信息表,输入空格和回车提示错误信息,输入查询内容,匹配打印相关信息


编程 2

代码分享如下: 

keystone工作一段时间后,发觉每次验证用户的账号密码,很是麻烦,效率太低,而且用户等待时间也过久,严重印象了服务质量。于是他向老板提出建议,能不能发一个token给验证过的用户,让用户在之后的一段时间里可以使用token作为身份信息,那这样验证起来效率就高很多。老板一听感觉还不错,就答应了。于是就有了这样的验证机制:

  ID  Name  Department  Phone

上一篇内容:

导读:本博文简要介绍openstack中keystone模块,受众是刚接触openstack的同学。

(未完待续)

〇上一篇已经实现基本要求,但代码还有所欠缺,比如登录成功后输入回车或空格会把文件信息作一次性读取出操作,而此篇内容为对上一篇的修改补充;可实现功能:

很快公司又出台了keystone工作流程以为提高keystone服务质量。
服务间访问流程如下:

 效果预览:

  3.输入同一用户名错误累计3次加入黑名单

这样一来,终于解决了用户信息,权限的问题,我们也方便去找哪个员工此时在哪。想到此时老板就对要招的新员工的工作有个定位了,他就是管理所有人信息,记录每个人的权限,记录每个员工的职位,以及办公地点。有了上述信息后,他就可以验证每个顾客和员工的身份信息。恩,他就叫keystone.

编程 3

 1 #!/usr/bin/env/python                                                            #声明解释器
 2 # -*- coding: utf-8 -*-                                                           #声明使用utf-8编码,此行Python3不需要
 3 import sys                                                                         #导入sys模块
 4 import time                                                                                                                 #导入time模块                              
 5 
 6 dic_account = {}                                                                                                            #定义一个空字典
 7 normoal_file = "G:\python\exsise\\file\whitelist.txt"                                                                       #白名单文件,存放用户名与密码的本地文件,注意路径前'\\'
 8 lock_file = "G:\python\exsise\\file\lock.txt"                                                                               #黑名单文件,我用的是我的本地文件存放的绝对路径
 9 with open(normoal_file) as norm_f:                                                                                          #打开白名单文件
10     for line in norm_f.readlines():                                                                                         #for循环,readlines()一次性读取所有行
11         usr,pawd = line.strip().split()                                                                                     #每行去除空格分割后分别赋予两个变量
12         dic_usr_pawd = {usr:pawd}                                                                                           #以每一行得到的两个变量为键值对就生成一个字典
13         dic_account.update(dic_usr_pawd)                                                                                    #循环更新扩展字典
14 
15 def deny_accout(usrname):                                                                                                   #定义了黑名单的函数
16     print('\033[1;31;40m')                                                                                                  #下一目标输出背景为黑色,颜色红色高亮显示
17     print('*' * 50)                                                                                                         #输出打印信息
18     print('\033[7;31m错误次数超限,用户已被永久锁定,请联系管理员!\033[1;31;40m')                                                 #字体颜色红色反白处理
19     print('*' * 50)                                                                                                         #打印50个*号
20     print('\033[0m')                                                                                                        #屏幕输出颜色恢复默认值
21     with open(lock_file,'a') as deny_f:                                                                                     #以追加模式打开黑名单文件
22         deny_f.write('\n')                                                                                                  #换行
23         deny_f.write(usrname)                                                                                               #黑名单中写入锁定用户
24      sys.exit()                                                              #执行sys模块退出方法
25 def main():                                                                                                                 #定义主函数
26     NumOfInput = 1                                                                                                          #定义输入次数变量NumOfInput初始值为1
27     usr_list = []                                                                                                           #定义一个空列表
28     while True:                                                                                                             #while 循环
29         usrname = input('\033[1;32m请输入您的用户名:\033[0m')                                                                 #用户交互第一步:请输入用户名
30         if list(dic_account.keys()).count(usrname) == 0:                                                                    #计算输入的用户名在字典里对应键个数是否为零
31             if len(usrname.strip()) == 0:                                                                                   #如果输入为空
32                 print('\033[1;31m用户名不能为空,请重新输入')                                                                   #打印相应提示信息
33             else:                                                                                                           #否则(既输入不为空)
34                 with open(lock_file) as lock_f:                                                                             #打开黑名单文件进行后一步操作
35                     for line in lock_f.readlines():                                                                         #对于line在黑名单文件中的其中一行,readlines()一次性读取所有行
36                         if usrname == line.strip():                                                                         #如果输入用户名等于黑名单其中一员
37                             sys.exit('\033[1;41m用户%s已锁定,请联系管理员。\033[0m' % usrname)                                 #退出并提示用户账户已锁定
38                 usr_list.append(usrname)                                                                                    #对列表进行附加元素操作
39                 redo_num = usr_list.count(usrname)                                                                          #计算列表里元素存在的为usrname个数并赋值变量,usrname引用输入的用户名变量
40                 if redo_num == 3:                                                                                           #如果列表计算的用户名个数小于3(这里的意思为如果尝试输入的同一个用户名应小于3次)
41                     deny_accout(usrname)                                                                                   #调用deny_accout()函数,既同一用户名输入次数超过3次加入黑名单
42                 elif NumOfInput < 5 :                                                                                       #如果循环输入次数不超过5次
43                     NumOfInput += 1                                                                                         #变量每次循环自增1
44                     print("\033[1;31m出错了,用户名:%s没有找到,请重新输入:" % usrname)                                       #打印相应的错误提示信息
45                 else:                                                                                                       #否则(输入次数超过5次)
46                     print('\033[1;33m用户名错误次数超限,请5分钟后再试')                                                         #打印错误提示
47                     time.sleep(300)                                                                                         #调取time模块方法,5分钟内无法操作
48         else:                                                                                                              #否则(既输入的用户名在白名单中存在)
49             NumOfInput = 0                                                                                                  #同样赋予输入次数变量NumOfInput初始值为0
50             while NumOfInput < 3:                                                                                           #进入while循环,输入次数不超过3
51                 passwd = input('\033[1;32m请输入用户%s密码:\033[0m' % usrname)                                               #输入用户名密码
52                 if passwd == str(dic_account[usrname]):                                                                     #如果密码与字典里对应输入用户名的键值相同
53                     print('\033[1;36m登陆成功。您的所有操作有可能会被记录!')                                                    #打印登录成功信息
54                     while True:                                                                                             #while循环
55                         match_yes = 0                                                                                       #定义一个变量初始值与后面的赋值对应,具有特殊意义
56                         sch_input = input("\033[1;34;42mPlease enter what the information you need to search: ")            #请输入你想查找的信息
57                         InfoOfEmTab_file = open("TheInfoOfEmployeeTable.txt")                                               #对文件进行操作,打开员工信息表文件
58                         while True:                                                                                         #嵌套while循环,目的是读取文件每一行
59                             line = InfoOfEmTab_file.readline()                                                              #读取文件的一行,readline()每次读取一行
60                             if len(line) == 0: break                                                                        #读取到文件结尾后结束退出
61                             if sch_input.strip() in line:                                                                   #假如输入内容在读取文件的其中一行
62                                 if sch_input.strip() == '':                                                                 #假如输入空格或者回车
63                                     match_yes = 1                                                                           #满足条件后给变量赋予新值(注:变量赋值不输出任何信息)
64                                 else:                                                                                       #否则
65                                     print("\033[1;31mMarch Item: \033[1;36m%s" % line)                                      #打印匹配信息
66                                     match_yes = 2                                                                           #满足条件后给变量赋予新值,与初始变量值不同,所以不打印当变量值为初始值的提示信息
67                         if match_yes == 0:                                                                                  #变量值如果等于初始值(可以理解为输入不为空或者回车,且用户输入的查找内容不在信息表的任一行)
68                             print("\033[1;31mNo match items had found!Please check it and try again.\n")                    #打印变量等于初始值需要输出的提示信息
69                         if match_yes == 1:                                                                                  #对应之前赋值'match_yes = 1'
70                             print("\033[1;31mThere was no character input, please check if the input was corrected!\n ")   #打印赋值为1需要输出的提示信
71                 if len(passwd.strip()) == 0:                                                                               #如果输入密码为空
72                     print('\033[1;33m密码不能为空,请重新输入,您还有%d次机会。'% (2-NumOfInput))                                  #打印错误提示信息
73                     NumOfInput += 1                                                                                       #输入次数增加1
74                 else:                                                                                                    #否则(密码不为空而且密码不正确)
75                     print('\033[1;33m密码错误,请重新输入,您还有%d次机会。'% (2-NumOfInput))                                    #打印密码错误提示
76                     NumOfInput += 1                                                                                         #输入错误次数增加1
77             else:                                                                                                           #否则(输入次数超过3)
78                 print('\033[1;31m输入次数超限,请2小时后再试')                                                                  #打印错误提示
79                 time.sleep(7200)                                                                                           #调取time模块方法,2小时内无法操作
80 
81 if __name__ == '__main__':                                                                                                  #当模块被直接运行时,以下代码块将被运行,当模块是被导入时,则不运行
82     main()                                                                                                                  #执行main()函数

keystone正式加入Openstack后,第一天上班老板交给他一本岗位手册,上面告知它的工作内容是什么。首先他需要认证用户的身份合法并且具有执行相应操作的权限,其次用户在使用服务时,提供服务的人(比如nova)是其本人。最后Openstack各个组件间交互时,也要由他验证身份和权限。除此之外还要维护下表列出的一些表单,主要操作是增删改查。

下一篇内容:

 4.输入正确用户名,密码错误3次冻结2小时无法操作

  • 什么是keystone?
  • 为什么要keystone?
  • keystone为什么要设计成这样?
  • keystone client有哪些命令?
  • keystone 工作流程?

3.认证成功后查询正确信息 

 编程 4

  • admin 系统管理员
  • test 普通User
  • glance,nova OpenStack服务提供模块

代码: 

 编程 5

编程 6

2.员工信息表文件内容:

〇4 不同的错误锁定方式可以有所区别

  • admin_token认证
  • 用户密码方式认证
    • 本地认证
    • Token认证
    • 外部认证
#!/usr/bin/env python                                                           #声名python 解释器,env可根据环境寻找并运行默认版本
authen_dic = {"LiuPn":123,"WangXiaoMing":123456,"HaoXiaoBei":12345678}          #定义一个字典存放可登陆的用户及密码
usr_list = list(authen_dic.keys())                                              #操作字典转生成一个用户列表
while True:
    input_usr = input("Please input your username: ")                           #用户交互第一步:请输入用户名
    if usr_list.count(input_usr) >= 1:                                          #假设输入的用户名在用户名列表里出现次数大于等于1
        input_passwd = input("Please input %s's password: "% input_usr)         #用户交互第二步:请输入密码
        passwd = str(authen_dic[input_usr])                                     #操作字典取出用户密码并格式化为字符串
        while input_passwd != passwd:                                           #假设密码不相等时进入循环
            input_passwd = input("Password is incorrect!Try again:")
        else:                                                                   #对应前面,密码不正确时
            print("Logon successful!Welcome")                                   #打印成功信息
            while True:                                                         #登陆成功后进入while循环
                match_yes = 0                                                   #定义一个变量初始值与后面的赋值对应
                sch_input = input("\033[1;34;42mPlease enter what the information you need to search: ")
                                                                                #请输入你想查找的信息
                InfoOfEmTab_file = open("TheInfoOfEmployeeTable.txt")           #对文件进行操作,打开员工信息表文件
                while True:
                    line = InfoOfEmTab_file.readline()                          #读取文件的每一行
                    if len(line) == 0: break                                    #读取到文件结尾后结束退出
                    if sch_input in line:                                       #假设用户输入的内容在信息表文件的其中一行中
                        print("\033[1;31mMarch Item: \033[1;36m%s" % line)      #格式化输出打印信息
                        match_yes = 1                                           #满足条件后给变量赋予新值(注:变量赋值不输出任何信息)
                if match_yes == 0:                                              #变量值如果等于初始值则打印信息(这里变量初始值对应上一条件里给变量赋予了一个新的值,所以可以理解成变量值不等于1,即用户输入的内容不在信息表的任一行里)
                    print("\033[1;31mNo match items had found!Please check it and try again.\n")
    else:                                                                       #对应之前用户名输入不正确
        print("The user name:%s is not found. Please re-enter your username." % input_usr)

1.需要用户认证

老板终于解决了用户信息的问题,刚想坐下来喝杯茶休息一下,我们的glance又来了。glance问老板,我找不到nova了,老板想了下nova业务众多,给他分配的办公室也多,找起来是不方便。最好可以记录下每个员工的位置信息,这样新员工入职后,也方便老员工去找。最好是先记录每个员工是干什么的,再记录他们办公在哪,而且这两张表还要分开,因为办公室有可能更改。记录员工工作内容的就叫
service,记录员工工作地方的就叫endpoint好了。
编程 7

1.需要用户认证

 编程 8

为了形象介绍keystone概念,我们假设OpenStack为一家新成立的公司,其主要业务是对外提供服务,具体服务请自行脑补^^.
新公司刚开业,为首之际当然是招聘员工。小型创业公司人手不要多,每个服务来一个就够用。经过一番拼搏,最后脱颖而出的有nova,glance,neutron等。公司老板想,人数不多嘛,大家互相见一见就认识了,不如就由nova负责他们的信息认证。
公司人手招够,开始对外服务,作为第一波顾客的我们来到OpenStack柜台。一看有客人到来,负责安全认证的nova赶紧上来问我们是谁,打哪而来,准备去哪。我们刚准备回答,glance楼上大喊一声将nova叫走。老板一看nova业务繁忙也确实忙不过来,是应该考虑再招一个人,这个人工作内容是什么呢,老板开始思考。无论如何,先招待第一波客人是关键,于是老板亲自来招待我们。首先当然是登记个人信息,注册一个账号。信息不用多,名字,密码,邮箱即可。老板想,最好是有这样的一个表让顾客申请,叫做user。

〇解决一次性输出文件所有信息的BUG

突然楼上nova电话打叫保安,好像是有一个顾客偷偷跑到他们后台办公地方。老板一想nova可是公司核心员工,所做的都关乎公司核心机密,怎么好让顾客能让公司里随便出入呢。一定要杜绝这个现象,要在顾客信息里加一栏权限。但是刚才客户表也填好了,也不好让顾客重新填。那就干脆重新弄一张表来记录用户的权限,就叫它role吧
编程 9
每一个用户可以分配不同的角色, 如这里列出有member和admin。

 编程 10


〇3.用户输错密码超限后锁定

type Description Add Delete Update Get
user 用户,理解为公司内员工 create delete update/password-update list/get
tenant 租户,理解为公司内不同的部门 create delete update list/get
role 角色,理解为公司部门内不同的权限 create delete   list/get
service 服务,用于注册服务 create delete   list/get
endpoint 端点,用于记录服务地址 create delete   list/get
ec2-credentials 信任证书 create delete   list/get
user-role 绑定用户和权限的关系 add remove update list

  ID  Name  Department  Phone

  1. 创建keystone client对象。通过keystone
    client向keystone服务器发送认证请求,申请用户token。
  2. 创建要访问的组件相应的client对象,根据对象找到其endpoint信息
  3. client向openstack服务发送http请求,通过auth_token过滤器认证。认证通过后,openstack调用相应的方法处理请求。

 2.输入黑名单成员直接锁定退出

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-08/134168.htm

编写可供用户查询的员工信息表

至此新员工keystone工作介绍就告一段落了。

3.认证成功后查询正确信息 

编程 11

 编程 12

要求:

 执行效果图:

 1.输入空格或回车不计算次数,其他不同用户超过5次冻结5分钟无法操作

〇1.编写登录接口,输入用户名和密码

〇2.用户验证成功登录后显示登录欢迎信息