返回《Module Zero学习目录》


用户实体##

用户实体代表应用的一个用户,它派生自AbpUser类,如下所示:

  1. public class User : AbpUser<Tenant, User>
  2. {
  3. //这里添加你自己的用户属性
  4. }

这个类是你在安装module-zero时自动创建的。用户数据存储在数据库中的AbpUsers表。你可以添加User类的自定义属性(以及针对改变创建数据库迁移)。

AbpUser类定义的基本属性如下:

  • UserName:用户的登录名,对于一个租户来说应该是唯一的。
  • EmailAddress:用户的邮箱地址。对于租户来说应该是唯一的。
  • Password:用户的哈希密码。
  • IsActive:如果用户可以登录到该应用,那么此值为true。
  • NameSurname:用户的名和姓。

还有许多属性,如Roles, Permissions, Tenant, Settings, IsEmailConfirmed等等。你可以在AbpUser类中查看更多信息。

AbpUser类派生自FullAuditedEntity。这意味着它有创建,修改和删除的审计属性。它也支持软删除。因此当我们删除一个用户的时候,实际上它并没有从数据库中删除,而是仅仅标记为已删除的状态。

为了在一个多租户的应用中更好地工作,AbpUser类实现了IMayHaveTenant过滤器。

最后,User的Id定义为long类型。

用户管理者##

用户管理者是执行用户领域逻辑的服务:

  1. public class UserManager : AbpUserManager<Tenant, Role, User>
  2. {
  3. //...
  4. }

你可以注入用户管理者,然后使用它来创建,删除,更新用户,为用户授权,改变角色以及更多。你可以在这里添加你自己的方法。而且,你可以重写AbpUserManager基类的任何方法来满足你自己的需求。

多租户

如果你创建的不是一个多租户应用,那么你可以跳过本节。

曾经设计UserManager的目的是为单租户服务的。默认是为当前租户服务的。接下来看一下UserManager的一些用法:

  1. public class MyTestAppService : ApplicationService
  2. {
  3. private readonly UserManager _userManager;
  4. public MyTestAppService(UserManager userManager)
  5. {
  6. _userManager = userManager;
  7. }
  8. public void TestMethod_1()
  9. {
  10. //Find a user by email for current tenant
  11. var user = _userManager.FindByEmail("sampleuser@aspnetboilerplate.com");
  12. }
  13. public void TestMethod_2()
  14. {
  15. //Switch to tenant 42
  16. CurrentUnitOfWork.SetFilterParameter(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId, 42);
  17. //Find a user by email for the tenant 42
  18. var user = _userManager.FindByEmail("sampleuser@aspnetboilerplate.com");
  19. }
  20. public void TestMethod_3()
  21. {
  22. //Disabling MayHaveTenant filter, so we can reach to all users
  23. using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant))
  24. {
  25. //Now, we can search for a user name in all tenants
  26. var users = _userManager.Users.Where(u => u.UserName == "sampleuser").ToList();
  27. //Or we can add TenantId filter if we want to search for a specific tenant
  28. var user = _userManager.Users.FirstOrDefault(u => u.TenantId == 42 && u.UserName == "sampleuser");
  29. }
  30. }
  31. }

用户登录

UserManager有一个登录到该应用的LoginAsync方法。它检查所有的登录逻辑并返回一个登录结果。查看样例AccountController中Login方法的示例用法。

关于IdentityResults

UserManager的一些方法返回了IdentityResult作为结果而不是抛出一些情况的异常。这是ASP.NET Identity Framework的本质。Module-zero也遵循这个。因此,我们可以查看这个返回的结果对象就可知道操作是否成功。

Module-zero定义了CheckErrors扩展方法,它可以自动地检查错误,如果需要,也会抛出异常(本地化的UserFriendlyException)。样例用法:

  1. (await UserManager.CreateAsync(user)).CheckErrors();

为了获得一个本地化的异常,我们应该提供一个ILocalizationManager实例:

  1. (await UserManager.CreateAsync(user)).CheckErrors(LocalizationManager);

外部认证

Module-zero的Login方法会认证数据库的AbpUsers表中的用户。一些应用可能要求认证来自外部资源的用户(比如活动目录,来自其他数据库的表,甚至来自一个远程服务)。

对于很多情况,UserManager定义了一个名叫“外部认证资源”的扩展点。我们可以创建一个派生自**IExternalAuthenticationSource 的类,然后将它注册到配置中。有一个简化了IExternalAuthenticationSource的实现的类DefaultExternalAuthenticationSource **,来看一个例子:

  1. public class MyExternalAuthSource : DefaultExternalAuthenticationSource<Tenant, User>
  2. {
  3. public override string Name
  4. {
  5. get { return "MyCustomSource"; }
  6. }
  7. public override Task<bool> TryAuthenticateAsync(string userNameOrEmailAddress, string plainPassword, Tenant tenant)
  8. {
  9. //TODO: authenticate user and return true or false
  10. }
  11. }

在TryAuthenticateAsync方法中,我们可以检查来自某些资源的用户名和密码,如果给定的用户通过了该资源的认证,那么返回true。而且,我们可以重写CreateUser和UpdateUser方法来控制该资源的用户创建和更新。

当外部资源验证通过一个用户后,module-zero会检查数据库(AbpUser表)中是否存在该用户。如果不存在,就会调用CreateUser来创建该用户,否则调用UpdateUser使外部源更新已存在的用户信息。

在一个应用中,我们可以定义不止一个外部源。AbpUser实体有一个AuthenticationSource属性,它表明了哪个源认证了该用户。

为了注册认证源,我们可以在模块中的PreInitialize方法使用这些代码:

  1. Configuration.Modules.Zero().UserManagement.ExternalAuthenticationSources.Add<MyExternalAuthSource>();

LDAP/活动目录

LdapAuthenticationSource是一个外部认证的实现,它可以让用户使用他们的LDAP(活动目录)用户名和密码登录。

如果我们想要使用LDAP认证,那么我们首先要将Abp.Zero.Ldap添加到项目中(通常添加到Core(领域)项目)。然后,我们应该给应用扩展LdapAuthenticationSource,如下所示:

  1. public class MyLdapAuthenticationSource : LdapAuthenticationSource<Tenant, User>
  2. {
  3. public MyLdapAuthenticationSource(ILdapSettings settings, IAbpZeroLdapModuleConfig ldapModuleConfig)
  4. : base(settings, ldapModuleConfig)
  5. {
  6. }
  7. }

最后,我们应该设置AbpZeroLdapModule的模块依赖,然后开启上面创建的LDAP认证源:

  1. [DependsOn(typeof(AbpZeroLdapModule))]
  2. public class MyApplicationCoreModule : AbpModule
  3. {
  4. public override void PreInitialize()
  5. {
  6. Configuration.Modules.ZeroLdap().Enable(typeof (MyLdapAuthenticationSource));
  7. }
  8. ...
  9. }

这些步骤之后,你的应用就开启了LDAP模块。但LDAP认证默认没有开启,我们可以使用设置来开启它。

设置

LdapSettingNames类定义了一些设置名称的常量。当要改变设置(或者获取设置)时,你可以使用这些常量名称。LDAP设置是每个租户的(对于多租户应用)。因此,不同的租户有不同的设置。(在github上查看设置的定义)

正如你在MyLdapAuthenticationSource的构造函数中看到的,LdapAuthenticationSource期望ILdapSettings作为构造函数参数。该接口用于获得LDAP设置,如领域,用户名和密码,以连接到活动目录。默认的实现(LdapSetting类)从设置管理者中获得这些设置。

如果你使用了设置管理者,你可以使用设置管理者的API改变LDAP的设置。如果你想要的话,你可以通过将一个初始化/种子数据添加到数据库来默认开启LDAP认证。

注意:如果你没有定义领域,用户名和密码,且你的应用运行在具有合适权限的领域中,那么LDAP认证只对当前的领域有效。

自定义设置

如果你想定义其他的设置源,那么你可以实现一个自定义的ILdapSettings类,如下所示:

  1. public class MyLdapSettings : ILdapSettings
  2. {
  3. public async Task<bool> GetIsEnabled(int? tenantId)
  4. {
  5. return true;
  6. }
  7. public async Task<ContextType> GetContextType(int? tenantId)
  8. {
  9. return ContextType.Domain;
  10. }
  11. public async Task<string> GetContainer(int? tenantId)
  12. {
  13. return null;
  14. }
  15. public async Task<string> GetDomain(int? tenantId)
  16. {
  17. return null;
  18. }
  19. public async Task<string> GetUserName(int? tenantId)
  20. {
  21. return null;
  22. }
  23. public async Task<string> GetPassword(int? tenantId)
  24. {
  25. return null;
  26. }
  27. }

然后在模块中的PreInitialize方法里将它注册到IOC中:

  1. [DependsOn(typeof(AbpZeroLdapModule))]
  2. public class MyApplicationCoreModule : AbpModule
  3. {
  4. public override void PreInitialize()
  5. {
  6. IocManager.Register<ILdapSettings, MyLdapSettings>(); //change default setting source
  7. Configuration.Modules.ZeroLdap().Enable(typeof (MyLdapAuthenticationSource));
  8. }
  9. ...
  10. }

这样,你就可以从其他资源获得LDAP设置了。

Module Zero之用户管理的更多相关文章

  1. ABP+AdminLTE+Bootstrap Table权限管理系统第十一节--Bootstrap Table用户管理列表以及Module Zero之用户管理

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 用户实体 用户实体代表应用的一个用户,它派生自AbpUser类,如下所示: public class User : ...

  2. Module Zero之角色管理

    返回<Module Zero学习目录> 角色实体 角色管理者 多租户 角色实体 角色实体代表了该应用的一个角色.它应该派生自AbpRole类,如下所示: public class Role ...

  3. puppet aix之自动化用户管理

    一.    用户组的管理 (一)   Puppet组管理特性 1.   manages_aix_lam 用来管理AIX的LAM(Loadable Authentication Module)系统. 2 ...

  4. dva + antd + mockjs 实现基础用户管理

    1.安装dva-cli npm install dva-cli -g 2.创建应用 dva new dvadashboard   [dvadashboard为项目名]       3.安装mockjs ...

  5. “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第五篇(用户管理之“用户权限分配”)

    一.在做权限分配之前,首先先了解“ZTree”这个插件,我的这个系统没有用Jquery-EasyUI的Tree.用的是”ZTree“朋友们可以试试,也很强大.点击下载ZTree插件.       1. ...

  6. 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计

    前言 近来公司需要构建一套 EMM(Enterprise Mobility Management)的管理平台,就这种面向企业的应用管理本身需要考虑的需求是十分复杂的,技术层面管理端和服务端构建是架构核 ...

  7. linux下用户管理命令、用户组管理命令

    useradd 添加新用户 1.基本语法 useradd 用户名                   (功能描述:添加新用户) useradd -g 组名 用户名      (功能描述:添加新用户到某 ...

  8. 一步步使用SpringBoot结合Vue实现登录和用户管理功能

    前后端分离开发是当今开发的主流.本篇文章从零开始,一步步使用SpringBoot结合Vue来实现日常开发中最常见的登录功能,以及登录之后对用户的管理功能.通过这个例子,可以快速入门SpringBoot ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(75)-微信公众平台开发-用户管理

    系列目录 前言 本节主要是关注者(即用户)和用户组的管理,微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号也提供了相应的接口 ...

随机推荐

  1. vuex

    英文:(Introduction)中文:https://github.com/vuejs/vuex/issues/176(贡献者努力中)

  2. nodejs复习04

    TCP/UDP网络应用 创建TCP服务器客户端 socket套接字对象实例,是对TCP协议的一个基本封装接口 clientt套接字对象实例 //server.js var net = require( ...

  3. Sprint计划

    团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...

  4. Hello, cnblogs !

    来博客园的第一天. 大学毕业三年多了,感觉自己碌碌无为,不知道自己究竟想做什么,就这样浑浑噩噩过了三年多. 记得大三那年,为了准备大四的毕业设计,自学了好几个月的Java EE.Java基础.Java ...

  5. 【原】iOS学习之tableView的常见BUG

    1.TableView头视图不随视图移动,头视图出现错位 错误原因:tableView的 UITableViewStyle 没有明确的声明 解决方法:在tableView声明的时候明确为 UITabl ...

  6. startssl申请配置免费https证书

    之前给业务配置都是在沃通上申请免费证书,而后通过反向代理层的Nginx进行https认证. 今天来了个新需求,要求域名直接解析至阿里云SLB.https配置需要通过阿里云的控制台部署这倒无所谓,只是在 ...

  7. 时代杂志发文:2017 AR/MR将变得比VR更加重要

    每到年末都有很多企业或高管分析科技产业明年趋势.近日,时代杂志网页版刊登了2017年科技行业的五大趋势和热点话题的预测.该本作者TimBajarin,是硅谷市场研究公司CreativeStrategi ...

  8. WP8如何添加Newtonsoft.Json包

    WP8开发的时候如何使用Newtonsoft.Json包呢?我在网上包括官网下的DLL文件,添加引用时都给出了这样的提示: 而后在网上找到的解决办法是:使用NuGet程序包来添加. 首先点击工具--& ...

  9. postman发送带cookie的http请求

    1:需求:测试接口的访问权限,对于某些接口A可以访问,B不能访问. 2:问题:对于get请求很简单,登录之后,直接使用浏览器访问就可以: 对于post请求的怎么测试呢?前提是需要登录态,才能访问接口. ...

  10. iOS推送原理

    1.首先app会和apns建立长连接,会发送 udid和 bundle id给apns 2.apns会返回给app一个device token 3.用会把device token 发给自己的服务器 4 ...