zoukankan      html  css  js  c++  java
  • (译)ABP之Abp Session

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Abp-Session

    介绍

    ABP提供IAbpSession接口获取当前用户和租户信息,而不是使用ASP.NET的Session。在ABP中,IAbpSession也被其他结构完全集成和使用。(例如设置系统和授权系统)。

    注入Session

    在需要用到IAbpSession的类中,通常是通过属性注入的,除非在没有Session信息时它不能运行。如果我们用属性注入,我们可以用NullAbpSession.Instance作为默认值,如下所示:

    public class MyClass : ITransientDependency
    {
        public IAbpSession AbpSession { get; set; }
    
        public MyClass()
        {
            AbpSession = NullAbpSession.Instance;
        }
    
        public void MyMethod()
        {
            var currentUserId = AbpSession.UserId;
            //...
        }
    }
    

    因为验证/授权是一个应用层任务,建议在应用层和上层模块使用IAbpSession(我们一般在领域层不用它),ApplicationServiceAbpControllerAbpApiController和其它一些基层类已经注入了AbpSession,因此,例如在你的应用服务方法里可以直接使用AbpSession属性。

    Session属性

    AbpSession定义了一些关键属性:

    • UserId:当前用户的Id,或者没有当前用户时为null,如果调用了授权方法,它就不可能为null。
    • TenantId:当前租户Id,或者没有当前租户时为null(如果用户没有登录或者他不是主用户)。
    • ImpersonatorUserId:如果当前session是由其它用户模拟的,则是模拟用户的Id,如果没有模拟登录,就为null。
    • ImpersonatorTenantId:如果当前session是由其它用户模拟的,则是模拟用户的租户Id,如果没有模拟登录,就为null。
    • MultiTenancySide:它可能是Host或者Tenant。

    UserId和TenantId为可空类型,同样也有非空类型的GetUserId()GetTenantId()方法,如果你确定一定存在一个当前用户,那你就可以调用GetUserId()方法;如果当前用户为null,调用这个方法就会抛异常,GetTenantId()方法也类似。

    模拟者属性与其他属性不一样,它通常是用来作审计日志用的。

    ClaimsAbpSession

    ClaimsAbpSession默认实现了IAbpSession接口,它从当前用户的声明中获取session属性(除了MultiTenancySide,它是计算出来的)。对于基于表格验证的cookie,它就是从cookie里获取的,因此,它很好地集成到ASP.Net的验证机制里了。

    覆盖当前Session的值

    在有些特定情况下,在一定作用域里,你可能需要改变或覆盖session的值。在这种情况下,你可以像下面这样使用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对象,而且它必须释放掉,一旦返回的值是可以释放的,session的值就会自动恢复到它之前的值。

    警告

    应该像上面的代码一样一定要使用using块,否则,你可能取到的session值不是预期中的值。你可以嵌套Use块,它们还是如你所预期的正常运行。

    User Identifier

    你可以使用.ToUserIdentifier()扩展方法从IAbpSession创建一个UserIdentifier对象,因为在大部分API里有使用UserIdentifier,这将让你为当前用户创建UserIdentifier对象变得很简单。

  • 相关阅读:
    python之约束、加密及logging模块
    python之反射机制与callattr()、issubclass()、isinstance、type()相关
    python之面向对象初识
    python函数名的应用、闭包和迭代器
    python(动态传参、命名空间、函数嵌套、global和nonlocal关键字)
    python中函数的定义、返回值以及参数的简要介绍
    python文件操作
    python中set(集合),深浅拷贝以及一些补充知识点
    python中is与==的区别,编码和解码
    python数据类型:dict(字典)
  • 原文地址:https://www.cnblogs.com/Lau7/p/8011928.html
Copyright © 2011-2022 走看看