2014-01-14 53 views
0

我在构建应用程序,其中一个包管理多个身份验证方法。允许多种身份验证方法的Python类结构

现在,它支持LDAP PAM 我想在未来,它支持多几个。

我有 PAM.pyLDAP.py

例如PAM.py内容包:

import pam 

class pam_auth: 

    def __init__(self, username=None, password=None): 
     self.username=username 
     self.password=password 

    def login(self):   
     res_auth=pam.authenticate(username=self.username, password=password) 
     return res_auth 

,并在另一个包我隔壁班的登录:

class Login: 

    def __init__(self,method=None): 
     self.authmethod=method 

    def login(self):   
     res_login=self.authmethod.login() 

     return res_login 

现在我正在构建我的授权码,如:

p=pam_auth() 
p.username="pep" 
p.password="just" 

l=Login(method=p) 
print l.login 

而且我相信这不是最好的方式来做到这一点,并且以多种方式和不同的方法来进行认证。 例如,可以像?:

l=Login(method=PAM.pam_auth) 
l.username="pep" 
l.password="just" 
print l.login() 

¿什么是我必须在登录级或PAM类改变这种方式来工作?

+0

相反,我相信前一种方法比后者灵活得多。另外,这就是在许多工作解决方案中设计身份验证的方法...... –

+1

http://en.wikipedia.org/wiki/Strategy_pattern –

回答

0

对于你提到的变化,所有你需要做的就是实例化Login__init__内部类:

class Login: 
    def __init__(self,method): 
     self.authmethod=method() 

然而,随着斯特凡诺圣菲利波提到的,这实际上可能阻碍模块化,因为突然Login绝知道认证方法的构造函数参数。


一对夫妇更提示:

如果你正在编写Python 2,你需要创建new-style classes:中

代替

class Login: 

使用

class Login(object): 

另外,如果您正在编写一个通用的身份验证层,您可能不想明确地处理用户名和密码:将来要使用第三因素,智能卡或生物特征身份验证时会发生什么?您可能应该处理不透明的“数据”,认证方法收到的数据不会改变。

+0

另外还有一些例如de PAM类的参数? – ManuParra

+0

是的,我的想法是,你可以覆盖一个类和支持,不仅是用户名或密码,还有与认证方法相关的每个参数。正如你所说,生物识别等不需要使用用户名等。 – ManuParra

+0

@ManuParra正如我所说,如果你采用这种方法,登录“必须知道认证方法的构造参数。”。最大的问题是这些构造函数参数会根据auth方法而有所不同。您可以将它们作为'* args,** kwargs'传递,但最好在Login外面实例化它并将它传递给一个实例,就像您现在正在做的那样。 – goncalopp

相关问题