importhashlibclassAuthException(Exception):def __init__(self, username, user=None):

super().__init__(username, user)

self.username=username

self.user=userclassUsernameAlreadyExists(AuthException):pass

classPasswordTooShort(AuthException):pass

classInvalidUsername(AuthException):pass

classInvalidPassword(AuthException):pass

classPermissionError(Exception):pass

classNotLoggedInError(AuthException):pass

classNotPermittedError(AuthException):pass

classUser:def __init__(self, username, password): # 用户名密码初始化,已经登录状态(默认是False)

self.username=username

self.password=self._encrypt_pw(password)

self.is_logged_in=Falsedef_encrypt_pw(self, password):

hash_string= (self.username +password)

hash_string= hash_string.encode("UTF-8")returnhashlib.sha256(hash_string).hexdigest()defcheck_password(self, password):

encrypted=self._encrypt_pw(password)return encrypted ==self.passwordclassAuthenticator: # 身份验证逻辑def __init__(self):

self.users={}defadd_user(self, username, password):if username inself.users:raiseUsernameAlreadyExists(username)if len(password) < 6:raisePasswordTooShort(username)

self.users[username]=User(username, password)deflogin(self, username, password):try:

user=self.users[username]exceptKeyError:raiseInvalidUsername(username)if notuser.check_password(password):raiseInvalidPassword(username, user)

user.is_logged_in=TruereturnTruedefis_logged_in(self, username):if username inself.users:returnself.users[username].is_logged_inreturnFalseclassAuthorizor: # 授权逻辑def __init__(self, authenticator):

self.authenticator=authenticator

self.permissions={}defadd_permission(self, perm_name):try:

self.permissions[perm_name]exceptKeyError:

self.permissions[perm_name]= set() #添加权限

else:raise PermissionError("permission Exists")defpermit_user(self, perm_name, username):try:

perm_set=self.permissions[perm_name]exceptKeyError:raise PermissionError("Permission does not exist")else:if username not inself.authenticator.users:raiseInvalidUsername(username)

perm_set.add(username)defcheck_permission(self, perm_name, username):if notself.authenticator.is_logged_in(username):raiseNotLoggedInError(username)try:

perm_set=self.permissions[perm_name]exceptKeyError:raise PermissionError("Permission does not exist")else:if username not inperm_set:raiseNotPermittedError(username)else:returnTrue

authenticator=Authenticator()

authorizor=Authorizor(authenticator)classEditor: # 封装成一个接口,方便调用def __init__(self):

self.username=None

self.menu_map={"login": self.login,"test": self.test,"change": self.change,"quit": self.quit

}deflogin(self):

logged_in=Falsewhile notlogged_in:

username= input("username:")

password= input("password:")try:

logged_in=authenticator.login(username, password)exceptInvalidUsername:print("Sorry, that username does not exist")exceptInvalidPassword:print("Sorry, incorrect password")else:

self.username=usernamedefis_permitted(self, permission):try:

authorizor.check_permission(permission, self.username)exceptNotLoggedInError as e:print("{} is not logged in".format(e.username))returnFalseexceptNotPermittedError as e:print("{} cannot {}".format(e.username, permission))returnFalseelse:returnTruedeftest(self):if self.is_permitted("test program"):print("Testing program now ...")defchange(self):if self.is_permitted("change program"):print("Changing program now...")defquit(self):raiseSystemExit()defmenu(self):try:whileTrue:print("""please enter a command:

\tlogin\tLogin

\ttest\tTest the program

\tchange\tChange the program

\tquit\tQuit""")

answer= input("enter a command:").lower()try:

func=self.menu_map[answer]exceptKeyError:print("{} is not a valid option".format(answer))else:

func()finally:print("Thank you for testing thr auth module")

Editor().menu() # 运行这个即可开启接口

# 主要是使用异常方式在处理各种情况,还可以有很多种处理方式,可以根据自己的项目来修改

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐