经常会遇到这样的情况,一个管理系统,如果是管理员登录和一般用户登录的权限是不同的,如:管理员登录那么可以对数据库进行编辑、修改,但是一般用户登录则只能对数据库进行查询,请问这是怎么实现的?? 有源码示例吗???在线等...谢谢!

解决方案 »

  1.   

    这不是通过客户端代码实现的,这是服务器决定的,以MSSQL Server为例,SA用户对所有数据库都有DBO权限,但其他用记就未必,这是MSSQL Server自身的安全性决定的。
      

  2.   

    type Powers
      PrintPower:boolean
      CheckPower: boolean
      ....
    end;定义一个全局powers变量,放在datamodule中,登陆的时候根据不同身份赋值即可
      

  3.   

    将对数据表的SQL查询通过一个函数来调用,在这个函数中对SQL语句进行检查——
    // 执行查询
    function QuerySQL(const SQLString: string): Boolean;
    var
      i: Integer;
    begin
      MSG_SECURITY_ERR := '';  // 权限检查
      if not CheckToken(SQLString) then
      begin
        Result := False;
        Exit;
      end;  // 当数据库已连接
      if MDM.MD.Connected then
      begin
        // 关闭Q_Login打开的表
        MDM.Q_Login.Close;
        with MDM.Q_Login.SQL do
        begin
          // 清除旧程序,添加新的SQL程序
          Clear;
          Add(SQLString);
        end;
        try
          // 执行并捕获异常
          MDM.Q_Login.ExecSQL;
        except
          // 如果异常,返回错误,并退出
          on DBError:EDBEngineError do
          begin
            MSG_SECURITY_ERR := '执行SQL语句时发生错误。错误信息:'#13;
            // 逐条返回异常信息
            for i:= 0 to DBError.ErrorCount - 1 do
              MSG_SECURITY_ERR := MSG_SECURITY_ERR + DBError.Errors[i].Message;
            Result := False;
            Exit;
          end;
        end;
        // 打开Q_Login查询的表
        try
          // 执行过 SELECT 子句才能生成视图
          if (Pos('SELECT', UpperCase(SQLString)) < 10) and ((Pos('SELECT', UpperCase(SQLString)) <> 0)) then
            MDM.Q_Login.Open;
        finally
          Result := True;
        end;
      end
      else begin
        MSG_SECURITY_ERR := '数据库未连通。';
        Result := False;
      end;
    end;
      

  4.   

    前文中的CheckToken函数判断SQL语句是否能够执行——
    // 检查权限
    function CheckToken(SQLString: string): Boolean;
    begin
      // 当不处于用户初始化状态时检查权限
      if not bInitAdmin then
      begin
        // SQL中有 Insert 子句
        if (Pos('INSERT', UpperCase(SQLString)) < 10) and
          (Pos('INSERT', UpperCase(SQLString)) <> 0) then
        begin
          // 检查用户有否插入权限,这个HasToken函数就自己写了
          Result := HasToken(AU_TOKEN_APPEND);
          if not Result then
            MSG_SECURITY_ERR := '当前用户没有插入权限对数据库进行操作。';
        end
        // SQL中有 Delete 子句
        else if (Pos('DELETE', UpperCase(SQLString)) < 10) and
          (Pos('DELETE', UpperCase(SQLString)) <> 0) then
        begin
          // 检查用户有否插入权限,这个HasToken函数就自己写了
          Result := HasToken(AU_TOKEN_DELETE);
          if not Result then
            MSG_SECURITY_ERR := '当前用户没有删除权限对数据库进行操作。';
        end
        else if (Pos('UPDATE', UpperCase(SQLString)) < 10) and
          (Pos('UPDATE', UpperCase(SQLString)) <> 0) then
        begin
          Result := HasToken(AU_TOKEN_EDIT);
          if not Result then
            MSG_SECURITY_ERR := '当前用户没有修改权限对数据库进行操作。';
        end
        else
          Result := True;
      end
      else
        Result := True;
    end;