def update_user(user=None): """ Install the user as current user of the app. Setup the g.current_user variable. Add the user to the session. Update Flask-Principal. If no user, install AnonymousIdentity """ if user: db.session.add(user) db.session.commit() g.current_user = user # Tell Flask-Principal the identity changed identity = Identity(user.id) identity.user = user # By default we can self need identity.provides.add(UserNeed(user.id)) # Add roles for role in user.roles: identity.provides.add(RoleNeed(role.name)) identity_changed.send(current_app._get_current_object(), identity=identity) else: # Tell Flask-Principal the user is anonymous identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity())
def _on_identity_loaded(self, sender, identity: Identity) -> None: """ Callback that runs whenever a new identity has been loaded. """ if hasattr(current_user, 'id'): identity.provides.add(UserNeed(current_user.id)) for role in getattr(current_user, 'roles', []): identity.provides.add(RoleNeed(role.name)) identity.user = current_user
def get_identity(user): """Create an identity for a given user instance. Primarily useful for testing. """ identity = Identity(user.id) if hasattr(user, 'id'): identity.provides.add(UserNeed(user.id)) for role in getattr(user, 'roles', []): identity.provides.add(RoleNeed(role.name)) identity.user = user return identity
def get_identity(user): """Returns the identity for a given user instance. This is needed because we are more explicit then Flask-Principal and it is MUCH more convenient for tests. """ if hasattr(user, 'id'): identity = Identity(user.id) identity.provides.add(UserNeed(user.id)) else: return AnonymousIdentity() for role in getattr(user, 'roles', []): identity.provides.add(RoleNeed(role.name)) identity.user = user return identity
def load_needs(sender, identity: Identity): identity.user = current_user if getattr(current_user, 'id', None): identity.provides.add(UserNeed(current_user.id)) identity.provides.add(RoleNeed(USER_ROLE))