代码之家  ›  专栏  ›  技术社区  ›  Georg Fritzsche

这种面向密钥的访问保护模式是已知的习惯用法吗?

  •  45
  • Georg Fritzsche  · 技术社区  · 14 年前

    Matthieu M. 提出了一种网络访问保护模式 this answer 我以前见过,但从来没有考虑过一种模式:

    class SomeKey { 
        friend class Foo;
        SomeKey() {} 
        // possibly make it non-copyable too
    };
    
    class Bar {
    public:
        void protectedMethod(SomeKey);
    };
    

    这里只有一个 friend 密钥类的 protectedMethod()

    class Foo {
        void do_stuff(Bar& b) { 
            b.protectedMethod(SomeKey()); // fine, Foo is friend of SomeKey
        }
    };
    
    class Baz {
        void do_stuff(Bar& b) {
            b.protectedMethod(SomeKey()); // error, SomeKey::SomeKey() is private
        }
    };
    

    它允许更细粒度的访问控制,而不是 Foo 朋友 属于 Bar 避免了更复杂的代理模式。

    有人知道这种方法是否已经有了一个名称,即是一个已知的模式吗?

    4 回复  |  直到 7 年前
        1
  •  15
  •   Community rcollyer    7 年前

    感谢 your other question

    b.protectedMethod(SomeKey());
    

    你可以打电话:

    b.protectedMethod({});
    
        2
  •  7
  •   Community rcollyer    7 年前

    似乎这个成语和另一个问题中提到的一样 here there .

        3
  •  2
  •   thomas    10 年前

    int FraudKey=0;
    b.protectedMethod(reinterpret_cast<SomeKey&>(FraudKey));
    
        4
  •  0
  •   user1703394    10 年前

    与此非常接近:

    http://minorfs.wordpress.com/2013/01/18/raiicap-pattern-injected-singleton-alternative-for-c/

    基本上,如果您认为对设计良好的类的对象的引用是 访问控制您需要实现任何真正有意义的访问控制策略,将此模式应用于构造函数以外的任何东西似乎没有多大意义。

    如本文所述,如果您将这个键与那些构造函数结合使用,那么

    http://www.eros-os.org/essays/capintro.html

    或者,您可以使用更通用的名称来引用它,比如construct authority。

    本文中的实现稍微以main为中心,也就是说,main需要创建所有的权限键。您可以对其进行扩展,并通过为密钥本身添加额外的公共构造函数使其更加灵活:

    template <typename T>
    class construct_authority {
      public:
        construct_authority(construct_authority<void> const&)
        friend int main(int,char **);
      private:
        construct_authority(){}
    };
    

    这样main就可以将密钥创建委托给程序的其他部分。

    我个人认为RAIICap名称非常适合这个模式的有用部分。

    不久前,我提议将上面这个简单的模板添加到标准库中。

    https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/p_v-aYIvO1E

    不幸的是,有一个主指纹可以构成一个计算根的想法存在问题,所以像这样的东西显然不能在标准库中占有一席之地。说到这里,至少对于RAII类的构造函数来说,这个模式似乎非常有用。