flask security将\u角色\u添加到\u用户不接受用户名

flask security将\u角色\u添加到\u用户不接受用户名,flask,flask-sqlalchemy,flask-security,Flask,Flask Sqlalchemy,Flask Security,当尝试将角色分配给用户时,使用用户名而不是电子邮件有什么诀窍 以下工作: user\u数据存储。将\u角色\u添加到\u用户('nunya@beezwax.com“,”站点管理员“) 这不起作用: user\u数据存储。将\u角色添加到\u用户('admin','site admin')) 它给出的错误是: AttributeError:“非类型”对象没有属性“角色” 我的模型看起来是这样的: roles_users = db.Table('users_to_roles', db.

当尝试将角色分配给用户时,使用用户名而不是电子邮件有什么诀窍

以下工作:

user\u数据存储。将\u角色\u添加到\u用户('nunya@beezwax.com“,”站点管理员“)

这不起作用:

user\u数据存储。将\u角色添加到\u用户('admin','site admin'))

它给出的错误是:

AttributeError:“非类型”对象没有属性“角色”

我的模型看起来是这样的:

roles_users = db.Table('users_to_roles',
    db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))


class User(db.Model, UserMixin):
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(16), unique=True)
  email = db.Column(db.String(256), unique=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'))

您需要将电子邮件作为字符串传递给用户,或者用户实体本身。因此,您可以通过用户名获取用户,然后将该用户实体发送到
add\u role\u to\u user

user_datastore.add_role_to_user(my_user, 'site-admin')

您需要将电子邮件作为字符串传递给用户,或者用户实体本身。因此,您可以通过用户名获取用户,然后将该用户实体发送到
add\u role\u to\u user

user_datastore.add_role_to_user(my_user, 'site-admin')

如果你看一下源代码, 将\角色\添加到\用户调用方法

def add_role_to_user(self, user, role):
        """Adds a role to a user.
        :param user: The user to manipulate
        :param role: The role to add to the user
        """
        user, role = self._prepare_role_modify_args(user, role)
        if role not in user.roles:
            user.roles.append(role)
            self.put(user)
            return True
        return False
这反过来又叫

def _prepare_role_modify_args(self, user, role):
        if isinstance(user, string_types):
            user = self.find_user(email=user)
        if isinstance(role, string_types):
            role = self.find_role(role)
        return user, role
此方法使用电子邮件检索用户对象。如果您确实需要通过用户名(并确保其唯一性)而不是电子邮件进行检索,您可以使用flask security并将行(第121行)更改为

然后从repo重新安装flask security(卸载flask security,然后安装)


我个人做了很多定制,效果很好。请注意,在需要修改角色时,如果查看源代码,则需要随时使用用户名, 将\角色\添加到\用户调用方法

def add_role_to_user(self, user, role):
        """Adds a role to a user.
        :param user: The user to manipulate
        :param role: The role to add to the user
        """
        user, role = self._prepare_role_modify_args(user, role)
        if role not in user.roles:
            user.roles.append(role)
            self.put(user)
            return True
        return False
这反过来又叫

def _prepare_role_modify_args(self, user, role):
        if isinstance(user, string_types):
            user = self.find_user(email=user)
        if isinstance(role, string_types):
            role = self.find_role(role)
        return user, role
此方法使用电子邮件检索用户对象。如果您确实需要通过用户名(并确保其唯一性)而不是电子邮件进行检索,您可以使用flask security并将行(第121行)更改为

然后从repo重新安装flask security(卸载flask security,然后安装)


我个人做了很多定制,效果很好。请注意,当您需要修改角色时,您将需要使用用户名。请使用flask security网站上的3个表,您的示例中不包括该角色表。这里我并没有包括“每一个细微差别”,只是代码的关键部分。我将用户表重命名为Users,因为某些数据库存在命名冲突。由于您提供的只是查询,您显然可以查询用户名或电子邮件(我使用的是电子邮件)

在您的uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.py(或app.py)中

models.py

roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('users.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))


class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))


class Users(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50), unique=True)
    name = db.Column(db.String(30))
    password = db.Column(db.String(255))
    about = db.Column(db.String(255))
    last_login_at = db.Column(db.DateTime())
    current_login_at = db.Column(db.DateTime())
    last_login_ip = db.Column(db.String(100))
    current_login_ip = db.Column(db.String(100))
    login_count = db.Column(db.Integer)
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())

    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))
views.py

from app import db, create_app

app = create_app()
app.app_context().push()
security = app.extensions.get('security')
在your views.py中查询用户和角色

u = Users.query.filter_by(email='test@example.com').first()
r = Role.query.filter_by(name='test').first()
security.datastore.add_role_to_user(u, r)
db.session.commit()

使用flask security网站上的3个表,您的示例中不包括角色表。这里我并没有包括“每一个细微差别”,只是代码的关键部分。我将用户表重命名为Users,因为某些数据库存在命名冲突。由于您提供的只是查询,您显然可以查询用户名或电子邮件(我使用的是电子邮件)

在您的uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.py(或app.py)中

models.py

roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('users.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))


class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))


class Users(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50), unique=True)
    name = db.Column(db.String(30))
    password = db.Column(db.String(255))
    about = db.Column(db.String(255))
    last_login_at = db.Column(db.DateTime())
    current_login_at = db.Column(db.DateTime())
    last_login_ip = db.Column(db.String(100))
    current_login_ip = db.Column(db.String(100))
    login_count = db.Column(db.Integer)
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())

    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))
views.py

from app import db, create_app

app = create_app()
app.app_context().push()
security = app.extensions.get('security')
在your views.py中查询用户和角色

u = Users.query.filter_by(email='test@example.com').first()
r = Role.query.filter_by(name='test').first()
security.datastore.add_role_to_user(u, r)
db.session.commit()

尝试:
auth\u user=user\u数据存储。查找用户(username='admin')
然后
user\u数据存储。将角色添加到用户(auth\u user,'site-admin')
。。。没有工作日志
auth_user
为了确保您也找到了实际用户,您可能需要添加用户名作为有效登录名:
app.config['SECURITY_user\u IDENTITY\u ATTRIBUTES']=('username','email')
尝试:
auth_user=user\u数据存储。查找用户(username='admin')
然后
user\u数据存储。添加用户角色到用户(auth_user,'site-admin')
…没有工作日志
auth_user
要确保找到实际用户,您可能还需要添加用户名作为有效登录名:
app.config['SECURITY_user\u IDENTITY\u ATTRIBUTES']=('username','email'))
无需修改源代码。只需使用我下面的解决方案:获取用户对象,然后向用户对象添加角色。正如您在上面的
\u prepare\u role\u modify\u args
中所看到的,如果您将用户对象传递给它,它就不需要获取用户。显然,OP无法让它工作,因此他给了我-1。无需修改源代码。只需使用我下面的解决方案:获取用户对象,然后将角色添加到用户对象。正如您在上面的
\u prepare\u role\u modify\u args
中所看到的,如果您将用户对象传递给它,它就不需要获取用户。显然,OP无法让它工作,因此他给了我-1。