在我使用的应用程序中,使用Flask-User及其建议的授权控制模型。这是一个例子:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
# User Authentication information
username = db.Column(db.String(50), nullable=False, unique=True)
password = db.Column(db.String(255), nullable=False, default='')
# User Email information
email = db.Column(db.String(255), nullable=False, unique=True)
confirmed_at = db.Column(db.DateTime())
# User information
is_enabled = db.Column(db.Boolean(), nullable=False, default=False)
# Relationships
roles = db.relationship('Role', secondary='user_roles',
backref=db.backref('users', lazy='dynamic'))
class Role(db.Model):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(50), unique=True)
class UserRoles(db.Model):
id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))
此外,作为Flask-User / Flask-Login的一部分,current_user
为我提供了一个与应用的当前用户相对应的User
对象(如果已登录),并且如我们的模型current_user.roles
返回Role
个对象的列表,对应于UserRoles
表绑定到当前用户的角色。
现在,在某些时候,我希望能够查询具有当前用户所具有的任何角色的所有用户。考虑到我们的current_user.roles
列表和SQL Alchemy中的模型,如何实现这一目标?如何选择any
User.roles
current_user.roles
与class UserProfileForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('plainPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'first_options' => array(
'label' => 'Password',
'constraints' => array(new NotBlank(array(
'groups' => array(
'updatePasswordChecked',
)
))),
),
'second_options' => array(
'label' => 'Repeat password',
'constraints' => array(new NotBlank(array(
'groups' => array(
'updatePasswordChecked',
)
))),
),
'invalid_message' => 'Passwords don\'t match!',
))
->add('oldPassword', PasswordType::class)
->add('save', SubmitType::class, array('label' => 'Save'));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User',
'validation_groups' => array('update'),
));
}
}
匹配的所有用户?
答案 0 :(得分:5)
将__repr__
添加到角色,如下所示:
class Role(db.Model):
#...
def __repr__(self):
return self.id
您可以使用以下查询来满足您的要求。
User.query.filter(User.roles.any(Role.id.in_([role.id for role in current_user.roles]))).all()