有没有办法限制特定用户访问某些应用程序?

Is there a way to restrict access to certain applications by specific users?

我已经创建了几个通过门卫与我们的中央授权服务器通信的应用程序。我想为特定用户制作一些应用程序accessible/inaccessible。

有没有办法限制对特定 oauth_applications 和 return 401 的访问?

我认为最简单的方法如下:

  1. 在您的看门人应用程序中,更改用户 table 以包含权限关系。比如,用户 -> 有很多 -> 权限

这些权限可以只包含您要授予他们访问权限的应用程序的名称,(或您选择的应用程序 ID)

  1. 然后,在您的 config/initializer/doorkeeper.rb - 在 Doorkeeper::JWT.configure 中 - 您添加特定用户可以在令牌有效负载内访问的应用程序,例如:
token_payload do |opts|
  ...
  token[:permissions] = user.permissions.pluck(:application_name)
end

如果您使用的是不带 JWT 的 Doorkeeper,您仍然可以通过在 ResponseToken 对象前添加自定义响应来将额外信息传递给令牌,如下所示:

Doorkeeper::OAuth::TokenResponse.send :prepend, CustomTokenResponse

和 CustomTokenResponse 只需要实现方法 body,像这样:

module CustomTokenResponse
  def body
    additional_data = {
      'username' => env[:clearance].current_user.username,
      'userid' => @token.resource_owner_id # you have an access to the @token object
      # any other data
    }

    # call original `#body` method and merge its result with the additional data hash
    super.merge(additional_data)
  end
end

可以在 Doorkeepers 的 wiki 中找到更多信息:https://github.com/doorkeeper-gem/doorkeeper/wiki/Customizing-Token-Response 在 Doorkeeper JWT gem 中:https://github.com/doorkeeper-gem/doorkeeper-jwt#usage

我想要同样的行为。我在 config/initializer/doorkeeper.rb 中使用 resource_owner_authenticator 块。当用户拥有一个或多个与 Oauth 应用程序连接的组时,它可以继续。

rails g model UserGroup user:references group:references
rails g model GroupApplications group:references oauth_application:references 
    resource_owner_authenticator do
      app = OauthApplication.find_by(uid: request.query_parameters['client_id'])

      user_id = session["warden.user.user.key"][0][0] rescue nil
      user = User.find_by_id(user_id)

      if !app && user
        user
      elsif app && user
        if !(user.groups & app.groups).empty?
          user
        else
          redirect_to main_app.root_url, notice: "You are not authorized to access this application."
        end
      else
        begin
          session['user_return_to'] = request.url
          redirect_to(new_user_session_url)
        end
      end
    end

2020 年 2 月 9 日,在 Doorkeeper 中引入了一个新的 configuration option 来完全做到这一点。

因此,您可以配置config/initializer/doorkeeper.rb:

authorize_resource_owner_for_client do |client, resource_owner|
  resource_owner.admin? || client.owners_whitelist.include?(resource_owner)
end