REST easy with kbmMW #14 – DB Controlled login REST easy with kbmMW #4 – Access management

介绍

关于如何使用授权和登录管理来构建应用服务器还存在一些问题,其中之一就是用户及其角色如何在在数据库中定义。该文将解释使用TkbmMWAuthorizationManager解决此问题的一种方法。有关其他的信息,可以参考前文REST easy with kbmMW #4 – Access management

首先,我们应该有一些需要登录支持的服务器。对于此示例,我选择了FishFact REST服务器。该服务器的实现可参考kbmMW #12 – Fishfact demo using HTTP.sys transport.

添加安全登录

基于该服务器,我们将TjkbmMWAuthorizationManager添加到主窗体(Unit1)。

然后我们需要确定如何从数据库中存储和访问用户信息。由于此示例已使用ORM访问数据库,因此继续使用ORM实现用户管理。

让我们添加一个描述用户的类:

  [kbmMW_Table('name:user')]
  TUser = class
  private
     FID:kbmMWNullable<string>;
     FName:kbmMWNullable<string>;
     FPassword:kbmMWNullable<string>;
     FRole:kbmMWNullable<string>;
  public
     [kbmMW_Field('name:"id", primary:true, generator:shortGuid',ftString,38)]
     property ID:kbmMWNullable<string> read FID write FID;
 
     [kbmMW_Field('name:"name"',ftString,50)]
     [kbmMW_NotNull]
     property Name:kbmMWNullable<string> read FName write FName;
 
     // A secure system should never store plain text passwords, but only SHA256 hashed ones.
     // In that case make room for 64 characters.
     [kbmMW_Field('name:"password"',ftString,50)]
     property Password:kbmMWNullable<string> read FPassword write FPassword;
 
     [kbmMW_Field('name:"role"',ftString,30)]
     property Role:kbmMWNullable<string> read FRole write FRole;
  end;

注意这里对password的警告,在这个例子中,我们在数据库中存储了明文密码,在实际的生产系统中是绝不允许的,相反,应该保存对密码加密后的结果,稍后再解释如何实现。现在,看看基于明文密码的实现方法。

在现有的Form.OnCreate事件处理程序中,我们应该让ORM确保用户表可用。此外,我们还应该定义此服务器接受的角色。

在我们的示例中,只有两种类型的用户...匿名用户和使用管理员权限登录的用户。除了一个需要管理角色的REST调用外,大多数功能都可供匿名用户使用。但首先要做的事情是:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
     FORM:=TkbmMWORM.Create;
     FORM.OpenDatabase(kbmMWSQLiteConnectionPool1);
     FORM.CreateOrUpgradeTable(TUser);
 
     // Add the one single role this application server knows about except anonymous.
     AuthMgr.AddRole('AdminRole');
 
     kbmMWServer1.AutoRegisterServices;
end;

这里有趣的部分是CreateOrUpgradeTable调用,它确保数据库中有一个名为user的表,以及一个名为AdminRole的角色的定义

在Unit1中我们还应该记得注册TUser类,以便kbmMW知道它的存在。当然,最好的地方是main form单元的初始化部分来注册TUser类:

...
initialization
  TkbmMWRTTI.EnableRTTI([TUser]);
  kbmMWRegisterKnownClasses([TUser]);
 
end.

猜你喜欢

转载自www.cnblogs.com/kinglandsoft/p/9282332.html
今日推荐