1、那再定义一个接口,先调用那个,验证后从那个接口的方法中返回这个接口,好像有例子就是这样的。
2、可能要根据需要,如果只是通过他执行事先定义Sql就不需要吧。
这方面不熟悉,共同学习。

解决方案 »

  1.   

    to:NightCloud() 
    你是说每次调用都要验证吗?我想是否可以在连接的时候进行验证,只要一次验证。
    象DATAPROVIDER的EXPORTED先设成FALSE,通过验证后,再把它设成TRUE。
    请大家继续发言
      

  2.   

    其实一楼说的方法就很好,为什么不用用呢?
    2.你可能利用用户登陆信息来判断是否有poallowcommand的权力
      

  3.   

    to kevincsg(土匪):
    我举个例子吧,一个学校管理系统,教师可以通过系统修改学生信息,在这个修改过程系统记录日志。
    但我不希望教师就可以操作数据库,如来一条DELETE FROM tblStudent
      

  4.   

    1、大概看了一下,没有在Delphi的Demos里找到这样的例子,Jbuilder里有,对于用Corba,方法应该都差不多了。先绑定管理接口,然后调用方法返回其他接口。至于如何验证,应该属于程序设计时逻辑上的问题了。
    Visibroker目录下也有这样的例子:
    比如接口这样定义。
    // Bank.idlmodule Bank {
      interface Account {
        float balance();
      };
      interface AccountManager {
        Account open(in string name);
      };
    };
    2、程序允许老师直接写Sql吗。他只有程序,又不需要给数据库的用户和口令。他怎么能作到随便操作数据库呢。
      

  5.   

    to lyxinfo():
    一个他客户端Account open以后就在服务器端创建了一个ACOUNT的对象,
    如何防止其他客户端用ORB.BIND()返回该对象的存根,调用该对象了?
    2、你不应该考虑正常的情况,在别人攻击的时候,他可以写一个程序通过服务端的DATAPROVIDER执行SQL语句。你的DATAPROVIDER就验证了应用程序的用户,却给了数据库用户的权限(可以发任何SQL语句)。
      

  6.   

    呵呵,安全的要求比较高啊。这方面作的也不很多,共同讨论吧。
    我想如果别人知道你程序的处理方法,并且能够得到可以通过程序验证的用户,那是怎么都可以不太困难的访问你的服务器对象并且访问数据库服务器的。
    比如你可以在Open的时候根据参数进行检验的,连接的用户是否合法,然后才引用已有的或初始化一个新的Account,初始化同样是可以有参数的。想要不通过AccountManager直接绑定Account接口,不了解你的程序的处理机制的情况下,恐怕是很困难的。感觉你说的其实是一个问题。
      

  7.   

    如果我没有ALLOWCOMMANDTEXT=TRUE,那么他们只能操作我的服务端程序写好的SQL语句。
    有些时候需要把接口暴露给别人,如第三方的接口(给其它人提供的接口,以便它人访问原有系统)
      

  8.   

    是呀,所以另外定义一个接口更方便些呢。
    我想可以在Open里创建服务器端对象的时候,在调用的接口实现类的构造函数里,根据登录的用户设置一个事先定义的属性值,标志用户可以进行的各种操作,并在各个方法实现里进行判断就可以了吧。
    一个想法,仅供参考。
      

  9.   

    上面的方法应该不错,但我有一个问题:
    客户端对服务器端对象的访问靠ORB.BIND(RepositoryID: string; const ObjectName...).
    我可以提供一个先创建的服务端对象,进行验证,如方法为:
    UserValid(username,password)
    {
       如果验证通过 
           创建其它服务端对象
    }
    现在:
    第一个客户端ORB.BIND进行验证的对象
    调用USERVALID通过
      (服务端创建其它对象)
    第一个客户端ORB.BIND其他对象,调用其他对象的方法
    但是这时候:
    我写一个程序是否也可以ORB.BIND其他对象?
      

  10.   

    这几天看了一些资料,理解是这样的:
    要想调用服务端的对象,这个对象必须先创建了的,才能返回他的接口。
    服务端的对象是用RepositoryID,ObjectName来标志的。
    RepositoryID标志对象接口,ObjectName标志对象的实例名。
    TCorbaObjectFactory.Create('AccountFactory', 'Account', 'IDL:AccountServer/AccountFactory:1.0', IAccount,TAccount, iMultiInstance, tmSingleThread);
    中的第一个参数('AccountFactory')好象改成什么都没关系,客户端连接的时候也用不上。
    问题:
        却可以创建RepositoryID,ObjectName都一样的对象?那么用ORB.bind的时候返回哪个对象的接口?
        服务端的对象一经创建,是否任意客户端都可以对它进行绑定,返回接口,进而可以调用它?有没有说创建的对象是某个客户端专用的对象?
      
      

  11.   

    我没有完全明白你的意思,看看我理解的对不,还是以这个例子吧
    是这样的,验证结果可以用来作为服务器Account对象构造函数的参数,在服务器端,如果有多个不同帐号用户调用这个接口,会创建多个对象的。
    只有AccountManager是直接Bind的,其他的都不可以。因为虽然对象已经存在了,我想对其他人也不太容易作到,因为除了写服务器端实现程序的人,可以让其他人很难得到直接Bind需要的正确参数。
      

  12.   

    TO lyxinfo:谢谢你!!!我的E_MAIL是[email protected],可以告诉我你的E e_mail吗?
    Bind需要的参数并不复杂,在CMD下OSFIND一下就出来了。
    我有了一点的发现:
    当AccountManager调用方法创建一个服务端对象的时候,
    它并不调用BOA.ObjIsReady(const Obj: IObject),所以这个对象对于其它的客户端是不可见的(用OSFIND也看不到)。妙在它返回了新建的接口给调用这个方法的客户端。
      

  13.   

    呵呵,好的。[email protected]
    其实我Corba用的不多,看过一些书和文档,不是很熟悉,而且感觉Delphi作Corba不很方便,共同学习吧。