如何限制用户调用特定方法

Posted

技术标签:

【中文标题】如何限制用户调用特定方法【英文标题】:How to restrict users from calling specific methods 【发布时间】:2015-06-19 02:04:22 【问题描述】:

我有一个包含一堆方法的类,我为每个方法编写了单元测试。类中的主要方法是encrypt 方法,它接收一条消息并对其进行加密。我还写了这个 encrypt 方法使用的 5 个其他方法,但我不希望用户能够调用这些方法,我只想在 encrypt 方法中使用它们来完成工作,但我不希望用户像@obj.some_method_that_is_not_encrypt 那样做,我只想使encrypt 方法可调用,我知道我可以将这些方法设为私有,但是我的单元测试将失败。我该如何处理这个问题?

【问题讨论】:

看这里***.com/questions/267237/…你可以使用send绕过私人。 @Doon 但这不是很臭吗? 气味判断留给读者作为练习:) 它打开了一个全新的蠕虫罐。但是,您(或您的班级)用户可以执行此操作并绕过私有这一事实意味着无论如何都应将私有视为建议。但可惜我没有一个好的答案。我通常测试类的公共接口/行为而不是每个函数,无论是对还是错。 【参考方案1】:

您的单元测试可以使用Object#send(...) 来调用私有方法:

class Foo
private
  def bar
    "ok"
  end
end

f = Foo.new
f.bar # => NoMethodError: private method `bar' called...
f.send(:bar) # => "ok"

因此,您的“加密”方法可能是唯一的公共方法,但它仍然可以使用不暴露给您图书馆的礼貌用户的私有方法(他们当然可以使用send如果他们愿意,也可以)。

还要注意,“私有”方法的一个特殊方面是它们不能用显式接收器调用,即使在同一个类中也是如此。所以你不能打电话给self.my_private_method,而只能打电话给my_private_method。例如:

class Foo
  def foo
    self.bar # => NoMethodError: private method `bar' called...
    bar # => "ok"
  end
private
  def bar; "ok"; end
end

【讨论】:

以上是关于如何限制用户调用特定方法的主要内容,如果未能解决你的问题,请参考以下文章

如何限制对 phpMyAdmin 中特定数据库用户帐户的访问?

限制对 C++ 中特定类的方法访问

如何在 laravel 上限制特定用户的路由

如何高度限制具有“特定角色”的用户从“某个地方”访问应用程序?

rest - 将用户限制在自己的数据中的方法

如何限制 .Net 程序集在特定机器上运行