假设我有一个用户,我已经从我的系统中软删除了他。我也想撤销他们的令牌。实现这一目标的最好方法是什么?它是不是就像这样简单
Doorkeeper::AccessToken.where(resource_owner_id: deleted_user.id).each(&:revoke)
还是有更好的方法?
发布于 2019-03-02 04:38:34
您可以这样做,其中application_id是Doorkeeper应用程序ID,resource_owner是已删除的用户:
Doorkeeper::AccessToken.revoke_all_for(application_id, resource_owner)由于您特别要求撤销用户的所有令牌(未提及应用程序),因此您的选择如下:
对于要撤销的每个应用程序ID,
上的作用域
适用于我的方法2的示例:
class User
def revoke_all_access_tokens!
application_ids = Doorkeeper::Application.pluck(:id) + [nil]
Doorkeeper::AccessToken.revoke_all_for(application_ids, self)
end
end请注意,如果您还想删除没有应用程序ID的令牌,则+ [nil]是必需的(这取决于您使用Doorkeeper的方式)。
如果您需要对其进行自定义,则code for this method很小且易于理解。
发布于 2021-07-08 12:05:46
@Justin Workman的答案很棒。
在检查了revoke_all_for方法的实现之后
def revoke_all_for(application_id, resource_owner, clock = Time)
by_resource_owner(resource_owner)
.where(
application_id: application_id,
revoked_at: nil,
)
.update_all(revoked_at: clock.now.utc)
end我发现,如果您想要撤销资源所有者的所有令牌,而不管应用程序是什么,只需调用:
Doorkeeper::AccessToken.by_resource_owner(resource_owner).where(revoked_at: nil).update_all(revoked_at: Time.now.utc)我们可以保存一个db调用,它可以计算出所有的application_ids。
https://stackoverflow.com/questions/46432383
复制相似问题