侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

详解ABP框架中Session功能的使用方法

技术  /  管理员 发布于 7年前   210

如果一个应用程序需要登录,则它必须知道当前用户执行了什么操作。因此ASP.NET在展示层提供了一套自己的SESSION会话对象,而ABP则提供了一个可以在任何地方
获取当前用户和租户的IAbpSession接口。

关于IAbpSession
需要获取会话信息则必须实现IAbpSession接口。虽然你可以用自己的方式去实现它(IAbpSession),但是它在module-zero项目中已经有了完整的实现。

注入Session
IAbpSession通常是以属性注入的方式存在于需要它的类中,不需要获取会话信息的类中则不需要它。如果我们使用属性注入方式,我们可以用
NullAbpSession.Instance作为默认值来初始化它(IAbpSession),如下所示:

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

由于授权是应用层的任务,因此我们应该在应用层和应用层的上一层使用IAbpSession(我们不在领域层使用IAbpSession是很正常的)。
ApplicationService, AbpController 和 AbpApiController 这3个基类已经注入了AbpSession属性,因此在Application Service的实例方法中,能直接使用AbpSession属性。

使用Session属性
AbpSession定义的一些关键属性:

  • UserId: 当前用户的标识ID,如果没有当前用户则为null.如果需要授权访问则它不可能为空。
  • TenantId: 当前租户的标识ID,如果没有当前租户则为null。
  • MultiTenancySide: 可能是Host或Tenant。

UserId和TenantId是可以为null的。当然也提供了不为空时获取数据的 GetUserId()和GetTenantId() 方法 。当你确定有当前用户时,你可以使用GetUserId()方法。

如果当前用户为空,使用该方法则会抛出一个异常。GetTenantId()的使用方式和GetUserId()类似。

ABP如何实现Session的
目录代码:

类图:

IAbpSession:IAbpSession接口

using Abp.MultiTenancy;namespace Abp.Runtime.Session{  public interface IAbpSession  {    long? UserId { get; }    int? TenantId { get; }    MultiTenancySides MultiTenancySide { get; }    long? ImpersonatorUserId { get; }    int? ImpersonatorTenantId { get; }  }}

NullAbpSession:实现了空对象模式

using Abp.MultiTenancy;namespace Abp.Runtime.Session{  /// <summary>  /// Implements null object pattern for <see cref="IAbpSession"/>.  /// </summary>  public class NullAbpSession : IAbpSession  {    /// <summary>    /// Singleton instance.    /// </summary>    public static NullAbpSession Instance { get { return SingletonInstance; } }    private static readonly NullAbpSession SingletonInstance = new NullAbpSession();    /// <inheritdoc/>    public long? UserId { get { return null; } }    /// <inheritdoc/>    public int? TenantId { get { return null; } }    public MultiTenancySides MultiTenancySide { get { return MultiTenancySides.Tenant; } }        public long? ImpersonatorUserId { get { return null; } }        public int? ImpersonatorTenantId { get { return null; } }    private NullAbpSession()    {    }  }}

ClaimsAbpSession:获取会话状态

using System;using System.Linq;using System.Security.Claims;using System.Threading;using Abp.Configuration.Startup;using Abp.MultiTenancy;using Abp.Runtime.Security;namespace Abp.Runtime.Session{  /// <summary>  /// Implements <see cref="IAbpSession"/> to get session properties from claims of <see cref="Thread.CurrentPrincipal"/>.  /// </summary>  public class ClaimsAbpSession : IAbpSession  {    private const int DefaultTenantId = 1;    public virtual long? UserId    {      get      {        var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;        if (claimsPrincipal == null)        {          return null;        }        var claimsIdentity = claimsPrincipal.Identity as ClaimsIdentity;        if (claimsIdentity == null)        {          return null;        }        var userIdClaim = claimsIdentity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);        if (userIdClaim == null || string.IsNullOrEmpty(userIdClaim.Value))        {          return null;        }        long userId;        if (!long.TryParse(userIdClaim.Value, out userId))        {          return null;        }        return userId;      }    }    public virtual int? TenantId    {      get      {        if (!_multiTenancy.IsEnabled)        {          return DefaultTenantId;        }        var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;        if (claimsPrincipal == null)        {          return null;        }        var tenantIdClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.TenantId);        if (tenantIdClaim == null || string.IsNullOrEmpty(tenantIdClaim.Value))        {          return null;        }        return Convert.ToInt32(tenantIdClaim.Value);      }    }    public virtual MultiTenancySides MultiTenancySide    {      get      {        return _multiTenancy.IsEnabled && !TenantId.HasValue          ? MultiTenancySides.Host          : MultiTenancySides.Tenant;      }    }    public virtual long? ImpersonatorUserId    {      get      {        var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;        if (claimsPrincipal == null)        {          return null;        }        var impersonatorUserIdClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorUserId);        if (impersonatorUserIdClaim == null || string.IsNullOrEmpty(impersonatorUserIdClaim.Value))        {          return null;        }        return Convert.ToInt64(impersonatorUserIdClaim.Value);      }    }    public virtual int? ImpersonatorTenantId    {      get      {        if (!_multiTenancy.IsEnabled)        {          return DefaultTenantId;        }        var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;        if (claimsPrincipal == null)        {          return null;        }        var impersonatorTenantIdClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorTenantId);        if (impersonatorTenantIdClaim == null || string.IsNullOrEmpty(impersonatorTenantIdClaim.Value))        {          return null;        }        return Convert.ToInt32(impersonatorTenantIdClaim.Value);      }    }    private readonly IMultiTenancyConfig _multiTenancy;    /// <summary>    /// Constructor.    /// </summary>    public ClaimsAbpSession(IMultiTenancyConfig multiTenancy)    {      _multiTenancy = multiTenancy;    }  }}

AbpSessionExtensions:IAbpSession扩展方法

using System;namespace Abp.Runtime.Session{  /// <summary>  /// Extension methods for <see cref="IAbpSession"/>.  /// </summary>  public static class AbpSessionExtensions  {    /// <summary>    /// Gets current User's Id.    /// Throws <see cref="AbpException"/> if <see cref="IAbpSession.UserId"/> is null.    /// </summary>    /// <param name="session">Session object.</param>    /// <returns>Current User's Id.</returns>    public static long GetUserId(this IAbpSession session)    {      if (!session.UserId.HasValue)      {        throw new AbpException("Session.UserId is null! Probably, user is not logged in.");      }      return session.UserId.Value;    }    /// <summary>    /// Gets current Tenant's Id.    /// Throws <see cref="AbpException"/> if <see cref="IAbpSession.TenantId"/> is null.    /// </summary>    /// <param name="session">Session object.</param>    /// <returns>Current Tenant's Id.</returns>    /// <exception cref="AbpException"></exception>    public static int GetTenantId(this IAbpSession session)    {      if (!session.TenantId.HasValue)      {        throw new AbpException("Session.TenantId is null! Possible problems: No user logged in or current logged in user in a host user (TenantId is always null for host users).");      }      return session.TenantId.Value;    }    /// <summary>    /// Creates <see cref="UserIdentifier"/> from given session.    /// Returns null if <see cref="IAbpSession.UserId"/> is null.    /// </summary>    /// <param name="session">The session.</param>    public static UserIdentifier ToUserIdentifier(this IAbpSession session)    {      return session.UserId == null        ? null        : new UserIdentifier(session.TenantId, session.GetUserId());    }  }}


  • 上一条:
    解析ABP框架领域层中的实体类与仓储类
    下一条:
    ABP框架的基础配置及依赖注入讲解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客