python认证教程_python 实现 身份验证+授权接口
importhashlibclassAuthException(Exception):def __init__(self, username, user=None):super().__init__(username, user)self.username=usernameself.user=userclassUsernameAlreadyExists(AuthException):passcla
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() # 运行这个即可开启接口
# 主要是使用异常方式在处理各种情况,还可以有很多种处理方式,可以根据自己的项目来修改
更多推荐
所有评论(0)