要使用名称而不是电子邮件地址登录(使用 Flask-Security 1.7.0 或更高版本),您可以将email字段替换为模型name中的字段User
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), unique=True, index=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
并更新app配置。
app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'name'
接下来,为了允许用户使用姓名而不是电子邮件登录,我们将使用LoginForm 验证方法假定用户身份属性位于email表单字段中这一事实。
from flask_security.forms import LoginForm
from wtforms import StringField
from wtforms.validators import InputRequired
class ExtendedLoginForm(LoginForm):
email = StringField('Username', [InputRequired()])
# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore,
login_form=ExtendedLoginForm)
这样,我们可以使用名称登录,而无需重写验证方法或登录模板。当然,这是一种 hack,更正确的方法是向类添加自定义validate方法(检查name表单字段)ExtendedLoginForm并相应地更新登录模板(如上面 Raja R 所做的那样)。或者更好的是,用 'user_identity' 字段替换 'LoginForm' 中的 'email' 表单字段,并重写 validate 方法以适应任何用户身份字段。
但是,上面的方法可以很容易地使用姓名或电子邮件地址登录。为此,请定义一个包含名称和电子邮件字段的用户模型。
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
name = db.Column(db.String(255), unique=True, index=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
并更新app配置。
app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = ('name','email')
最后,创建自定义登录表单。
from flask_security.forms import LoginForm
from wtforms import StringField
from wtforms.validators import InputRequired
class ExtendedLoginForm(LoginForm):
email = StringField('Username or Email Address', [InputRequired()])
# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore,
login_form=ExtendedLoginForm)
现在,登录时,Flask-Security 将在电子邮件表单字段中接受电子邮件或姓名。