还是刘艺那笨书上的例子~~~~~~~~~~~~555555,以后再也不看刘艺的书了!!!无论是按书上的例子用数据库存放用户信息,还是直接使用WebUserList的UserItem属性设置用户密码权限,两个方法的效果都一样,不行!只要是设置了“Login Required”的页面,不管需要或不需要权限,都进不了,Login页面始终在那里停住
请高手襄助,谢谢!

解决方案 »

  1.   

    如果你是用D7的话,可能要改一点源码,这是我在DR。BOB‘S那看到了,不过现在找不到了:(
    改WebAdapt.pas单元的如下地方,其中用(**)注释的部分是原来的代码,之前是改后的代码。BTW,你不看刘艺的书不如看我的书吧:)procedure TLoginFormAdapterLoginAction.ImplExecuteActionRequest(
      AActionRequest: IActionRequest; AActionResponse: IActionResponse);
    var
      UserID: Variant;
      S: TStrings;
      DefaultResponse: IGetAdapterRequestDefaultResponse;
    begin
      RedirectOptions := roRedirect;
      if (Adapter <> nil) then
        with Adapter do
        begin
          try
            NextPage := GetAdapterRequestParamsIntf(AActionRequest).ValueOfParam(sNextPage);
            if ( NextPage = '' ) // Only when no Next Page is defined
                AND Supports(WebContext.AdapterRequest, IGetAdapterRequestDefaultResponse, DefaultResponse) then
              NextPage := DefaultResponse.SuccessPage;
    (*
            if Supports(WebContext.AdapterRequest, IGetAdapterRequestDefaultResponse, DefaultResponse) then
              NextPage := DefaultResponse.SuccessPage
            else
              NextPage := GetAdapterRequestParamsIntf(AActionRequest).ValueOfParam(sNextPage);
    *)
      

  2.   

    我用D6的,BTW,你的什么书呀?
      

  3.   

    基本上都是按照书带的源码写的,采用将登陆信息存放在数据库中的方法。加???的是我不太理解的地方,登陆页面Login就只是加了个LoginFormAdapter1,好像跟在WEB应用模块中的事件代码互补相干?
    unit Unit_WebModule_HrHome;......type
      THrHome = class(TWebAppPageModule)
        AdapterPageProducer: TAdapterPageProducer;
        WebAppComponents: TWebAppComponents;
        ApplicationAdapter: TApplicationAdapter;
        PageDispatcher: TPageDispatcher;
        AdapterDispatcher: TAdapterDispatcher;
        EndUserSessionAdapter1: TEndUserSessionAdapter;
        WebUserList1: TWebUserList;
        SessionsService1: TSessionsService;
        AdaptDisplayName: TAdapterEndUserDisplayNameField;
        AdaptLoggedIn: TAdapterEndUserLoggedInField;
        WebDispatcher1: TWebDispatcher;
        adaptGrp: TAdapterField;
        adaptName: TAdapterField;
        procedure WebUserList1BeforeValidateUser(Strings: TStrings;
          var UserID: Variant; var Handled: Boolean);
        procedure adaptNameGetValue(Sender: TObject; var Value: Variant);
        procedure adaptGrpGetValue(Sender: TObject; var Value: Variant);
        procedure PageDispatcherCanViewPage(Sender: TObject;
          const PageName: String; var CanView, AHandled: Boolean);
        procedure WebAppComponentsBeforeDispatch(Sender: TObject;
          Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);  private
        { Private declarations }
      public  
        FEmpId,FGrpId:string;
      end;  function HrHome: THrHome;implementation{$R *.dfm}  {*.html}uses WebReq, WebCntxt, WebFact, Variants, Unit_DataModule_WDM;function HrHome: THrHome;
    begin
      Result := THrHome(WebContext.FindModuleClass(THrHome));
    end;
    {----------WebUserList1的OnBeforeValidateUser-----------------------}
    procedure THrHome.WebUserList1BeforeValidateUser(Strings: TStrings;  var UserID: Variant; var Handled: Boolean);//??这个事件到底作用是什么,在什么时候调用??var UserItem:TWebUserItem;
    begin
      //从basicinfo,enduser和usergroup表中联合查询出登录用户信息.
      wdm.adqTmp.SQL.Clear;
      wdm.adqTmp.SQL.Add('select b.Empid,a.name,b.password,b.groupid,c.grouptype ');
      wdm.adqTmp.SQL.Add('from basicinfo a,enduser b,usergroup c ');
      wdm.adqTmp.SQL.Add('where a.empid=b.empid and b.groupid=c.groupid and ');
      wdm.adqTmp.SQL.Add('b.empid='+#39+Strings.Values['UserName']+#39);
      wdm.adqTmp.SQL.Add(' and b.password='+#39+Strings.Values['Password']+#39);
      wdm.adqTmp.Open;
      //?这里我没弄明白,UserName和Password是哪来的?Strings.Values的作用是什么??  if wdm.adqTmp.RecordCount > 0 then
      begin
        UserID:=Strings.Values['UserName'];
        //验证通过
        {给UserItem的Username、Password、AccessRight赋值}
        UserItem:=WebUserList1.UserItems.Add as TWebUserItem;
        UserItem.UserName:=Strings.Values['UserName'];
        UserItem.Password:=Strings.Values['Password'];;
        UserItem.AccessRights:=wdm.adqTmp.FieldValues['groupid'];    FEmpId:=Strings.Values['UserName'];  //这里的两个变量用来干吗??
        FGrpId:=wdm.adqTmp.FieldValues['groupid'];    Session.Values['groupid']:=wdm.adqTmp.FieldValues['groupid'];
        Session.Values['empid']:=wdm.adqTmp.FieldValues['empid'];
        Session.Values['name']:=wdm.adqTmp.FieldValues['name'];
        Session.Values['grp']:=wdm.adqTmp.FieldValues['grouptype'];    Handled:=True; //让TWebUserList退出自动验证机制
      end
      else  Handled:=False;
    end;
    procedure THrHome.adaptNameGetValue(Sender: TObject; var Value: Variant);
    begin
      if not VarIsEmpty(Session.Values['Name']) then
        Value:=Session.Values['Name']
      else Value:='';
    end;procedure THrHome.adaptGrpGetValue(Sender: TObject; var Value: Variant);
    begin
      if not VarIsEmpty(Session.Values['grp']) then
        Value:=Session.Values['grp']
      else Value:='';
    end;procedure THrHome.PageDispatcherCanViewPage(Sender: TObject;
      const PageName: String; var CanView, AHandled: Boolean);
    begin
      if pageName='QryBasiInfo' then
        if  FGrpID<>'B2' then canview:=False;end;procedure THrHome.WebAppComponentsBeforeDispatch(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    var  i:integer;
    begin
      for  i:=0  to webcontext.Response.Cookies.Count-1  do
      begin
        if SameText(webcontext.Response.Cookies.Items[i].Name,'WebBrokerSessionID') then
        begin
          if  webcontext.Response.Cookies.Items[i].Expires=-1 then
             webcontext.Response.Cookies.Items[i].Expires:=IncDay(Date);
        end;
      end;
    end;initialization
      if WebRequestHandler <> nil then
        WebRequestHandler.AddWebModuleFactory(TWebAppPageModuleFactory.Create(THrHome, TWebPageInfo.Create([wpPublished {, wpLoginRequired}], '.html', '', '首页'), caCache));end.
      

  4.   

    我自己查出点毛病来了——我用SQL的事件探查器发现:wdm.adqTmp.SQL.Add(......)中的SQL语句存在逻辑上的错误,居然拿Empid值跟Username做比较?!(我是从书随带光盘的源码直接拷过来用的,没想到作者如此不负责!!!)在确定输入用户名和密码都正确、权限也符合(都和数据库中数据符合)的情况下,仍然没有显示所要求到达的页面!感觉现在的问题好像是没能跳出验证机制,按书上所说,可以通过对Handled的控制(设为True)来退出TWebUserList的自动验证机制,但现在似乎行不通......?
      

  5.   

    补充一句,登陆输入正确的话,不需要登陆的页面是可以进的,而设置成必须登陆(Login Required)的页面,如果是权限不对,会出现“Page access denied ”的错误提示;而权限对的页面无提示,只是始终停留在“Login”界面......如此看来,问题应该是在“自动验证机制”上, Handled是否起作用了?
      

  6.   

    WebUserList1的OnBeforeValidateUser是自定义身份验证的事件。
    Strings是参数,其内容来自LoginFormAdapter,其USERNAME/PASSWORD就是LoginFormAdapter中的相应Field。
    也许他的数据库里EMPID记录的就是用户登录名吧。
    剩下的障碍应该在这两个事件中,因为我没有他的全部程序,不清楚他在这里做的事是想干什么,你把这两个事件响应去掉再试试。
    PageDispatcherCanViewPage
    WebAppComponentsBeforeDispatch
      

  7.   

    delphi的帮助文件里不是有一个登陆的例子么.