ABP官方文档翻译 2.2 ABP会话
2017-04-26 22:16
295 查看
ABP会话
介绍
关于IAbpSession
注入会话
会话属性
覆盖当前会话值
警告!
用户标示
介绍
如果应用需要登录的话,同样也需要知道当前用户可以执行哪些操作。ABP在展现层提供了会话对象,同时ABP提供了IAbpSession接口获取当前用户和租户,不需要使用ABP会话。
关于IAbpSession
为了能活真正的会话信息,IAbpSession接口必须被实现。可以用自己的方式实现它,在 module-zero工程里有这个接口的完整实现。
IAbpSession也在ABP其他的结构中完全集成和使用(例如设置系统和授权系统)。
注入会话
IAbpSession通常通过属性注入到需要的类,除非这个类没有会话信息不能工作。如果我们使用属性注入,我们可以使用NullAbpSession.Instance作为默认值,示例如下:
因为鉴定/授权是应用层的任务,建议在应用层或更高层使用IAbpSession(通常在领域层不使用它)。ApplicationService、AbpController、AbpApiController和其他的一些基类已经注入AbpSession。所以,可以在应用服务方法中直接使用AbpSession属性获得实例。
会话属性
AbpSession定义了一些关键属性:
UserId:当前用户的Id或者为null,如果没有当前用户的话。如果调用代码是授权的,那么它就不可能为null。
TenantId:当前租户的Id或者为null,如果没有当前租户(如用户没有登录或者当前用户是租主用户)。
ImpersonatorUserId:模拟用户的Id,如果当前会话是另一个用户模拟登录。如果不是模拟用户登录则为null。
ImpersonatorTenantId:模拟用户租户的Id,如果当前会话是另一个用户模拟登录。如果不是模拟用户登录则为null。
MultiTenancySide:它可能是租主或租户。
UserId和TenantId是nullable类型。有GetUserId() 和GetTenantId()两个非null的方法。如果确定有当前用户,可以调用GetUserId()。如果当前用户是null,这个方法会抛出异常。GetTenantId()方法类似。
模拟属性并不如其他属性常见,通常用在审计日志。
覆盖当前会话值
在一些特殊例子中,可能需要更在一个有限的范围改/覆盖属性值。在这种情况下,可以使用IAbpSession.Use方法,如下:
Use方法返回IDisposable并且必须被处理。一旦返回值被处理,会话值自动恢复为之前的值。
警告!
总是在using块中使用它,如上所示。否则,可能会得到异常的会话值。可以嵌套Use块,他们可以按预期的工作。
用户标示
可以使用.ToUserIdentifier()扩展方法从IAbpSession创建用户标示对象。因为用户标示在大多数API中使用,这将简化为当前用户创建一个用户标示。
返回主目录
介绍
关于IAbpSession
注入会话
会话属性
覆盖当前会话值
警告!
用户标示
介绍
如果应用需要登录的话,同样也需要知道当前用户可以执行哪些操作。ABP在展现层提供了会话对象,同时ABP提供了IAbpSession接口获取当前用户和租户,不需要使用ABP会话。
关于IAbpSession
为了能活真正的会话信息,IAbpSession接口必须被实现。可以用自己的方式实现它,在 module-zero工程里有这个接口的完整实现。
IAbpSession也在ABP其他的结构中完全集成和使用(例如设置系统和授权系统)。
注入会话
IAbpSession通常通过属性注入到需要的类,除非这个类没有会话信息不能工作。如果我们使用属性注入,我们可以使用NullAbpSession.Instance作为默认值,示例如下:
public class MyClass : ITransientDependency { public IAbpSession AbpSession { get; set; } public MyClass() { AbpSession = NullAbpSession.Instance; } public void MyMethod() { var currentUserId = AbpSession.UserId; //... } }
因为鉴定/授权是应用层的任务,建议在应用层或更高层使用IAbpSession(通常在领域层不使用它)。ApplicationService、AbpController、AbpApiController和其他的一些基类已经注入AbpSession。所以,可以在应用服务方法中直接使用AbpSession属性获得实例。
会话属性
AbpSession定义了一些关键属性:
UserId:当前用户的Id或者为null,如果没有当前用户的话。如果调用代码是授权的,那么它就不可能为null。
TenantId:当前租户的Id或者为null,如果没有当前租户(如用户没有登录或者当前用户是租主用户)。
ImpersonatorUserId:模拟用户的Id,如果当前会话是另一个用户模拟登录。如果不是模拟用户登录则为null。
ImpersonatorTenantId:模拟用户租户的Id,如果当前会话是另一个用户模拟登录。如果不是模拟用户登录则为null。
MultiTenancySide:它可能是租主或租户。
UserId和TenantId是nullable类型。有GetUserId() 和GetTenantId()两个非null的方法。如果确定有当前用户,可以调用GetUserId()。如果当前用户是null,这个方法会抛出异常。GetTenantId()方法类似。
模拟属性并不如其他属性常见,通常用在审计日志。
覆盖当前会话值
在一些特殊例子中,可能需要更在一个有限的范围改/覆盖属性值。在这种情况下,可以使用IAbpSession.Use方法,如下:
public class MyService { private readonly IAbpSession _session; public MyService(IAbpSession session) { _session = session; } public void Test() { using (_session.Use(42, null)) { var tenantId = _session.TenantId; //42 var userId = _session.UserId; //null } } }
Use方法返回IDisposable并且必须被处理。一旦返回值被处理,会话值自动恢复为之前的值。
警告!
总是在using块中使用它,如上所示。否则,可能会得到异常的会话值。可以嵌套Use块,他们可以按预期的工作。
用户标示
可以使用.ToUserIdentifier()扩展方法从IAbpSession创建用户标示对象。因为用户标示在大多数API中使用,这将简化为当前用户创建一个用户标示。
返回主目录
相关文章推荐
- ABP官方文档翻译 4.2 数据传输对象
- zabbix2.2官方文档翻译系列――Tiggers(一)
- ABP官方文档翻译 3.6 工作单元
- ABP官方文档翻译 6.7 CSRF/XSRF保护
- ABP官方文档翻译 7.2 Hangfire集成
- ABP官方文档翻译 2.3 缓存
- ABP官方文档翻译 7.3 Quartz集成
- ABP官方文档翻译 8.2 SignalR集成
- cockroach官方文档翻译---2.2 SQL层
- ABP官方文档翻译 3.7 领域事件(事件总线)
- ICE官方文档中2.2【The Ice Architecture】章节翻译之二
- ABP官方文档翻译 2.4 日志
- ABP官方文档翻译 2.5 设置管理
- ABP官方文档翻译 3.3 仓储
- ABP官方文档翻译 3.6 工作单元
- ABP官方文档翻译 3.2 值对象
- ABP官方文档翻译 3.5 规约
- ABP官方文档翻译 3.5 规约
- Dojo1.11官方教程文档翻译(2.2)AMD模块入门
- ABP官方文档翻译 5.4 SwaggerUI集成