nopCommerce程序后台的登录操作所需要权限的加载是通过,其定义组件来实现的,所以nopCommerce程序后台页面的打开先完成其相应组件的定义实现。
- 重构Nop.Core.Domain.Customers.NopCustomerDefaults类。
<1>、定义Nop.Core.Domain.Customers.NopCustomerDefaults.FirstNameAttribute属性。
<2>、定义Nop.Core.Domain.Customers.NopCustomerDefaults.LastNameAttribute属性。
2、重构Nop.Services.Customers.ICustomerService接口和Nop.Services.Customers.CustomerService类。
<1>、定义Nop.Services.Customers.CustomerService.FormatUsernameAsync方法。
<2>、定义Nop.Services.Customers.CustomerService.IsGuestAsync方法。
<3>、定义Nop.Services.Customers.CustomerService.GetCustomerFullNameAsync方法。
3、在Nop.Services.Customers.CustomerRegistrationService.SignInCustomerAsync方法中添加语句:
await _workContext.GetCurrentCustomerAsync();
4、重构Nop.Services.Authentication.NopAuthenticationDefaults.LoginPath属性为:
public static PathString LoginPath => new PathString("/Customer/login");
0090 BaseNopModel、NopViewComponent、AuthorizeAdminAttribute
BaseNopModel类,通过该类中的默认构造方法为一个字典实例分配内存空间,及其在程序启动前,把指定的模型类及其属性成员与相应的视图页面进行绑定。
NopViewComponent类,通过该类把指定模型类实例及其值在相应的作为组件的局部视图页面上显示出来。
AuthorizeAdminAttribute类,通过调用基类方法以异步的操作方式,过滤指定用户是否具有相应的权限,对后台页面进行访问操作。
5、重构Nop.Web.Framework.UI.IPageHeadBuilder接口和Nop.Web.Framework.UI.PageHeadBuilder类。
<1>、定义Nop.Web.Framework.UI.PageHeadBuilder.AddEditPageUrl方法。
<2>、定义Nop.Web.Framework.UI.PageHeadBuilder.GetEditPageUrl方法。
6、去掉Nop.Web.Framework.WebWorkContext.SetCurrentCustomerAsync方法中下列语句的注释:
if (customer == null || customer.Deleted || !customer.Active || customer.RequireReLogin)
{
//获取一个已经注册的用户实体实例,并返回该用户实体实例。
customer = await _authenticationService.GetAuthenticatedCustomerAsync();
}
0091 AdminHeaderLinksModel、ICommonModelFactory、CommonModelFactory、AdmineaderLinksViewComponent
AdminHeaderLinksModel类,通过该类及其属性成员实例,与后台局部链接组件页面进行数据的交互操作。
CommonModelFactory类,继承于ICommonModelFactory接口,该类用来初始化/实例化一些与通用的、常规的模型实例。
注意:
为了简化操作与具体实现在该类及其接口中只保留了Nop.Web.Factories.CommonModelFactory.PrepareAdminHeaderLinksModelAsync方法,其它的操作方法都被删除了。
AdmineaderLinksViewComponent类,该类用来把其局部页面组件及后台头部链接模型实例中的数据在指定的视图页面中显示出来。
7、重构Nop.Web.Infrastructure.DependencyRegistrar.Register方法添加语句:
//通过.NetCore框架依赖注入容器实例的指定API方法,对通用模型工厂具体实现类进行依赖注入操作。
services.AddScoped<Factories.ICommonModelFactory, Factories.CommonModelFactory>();
8、定义Nop.Web\Views\Shared\Components\AdminHeaderLinks\Default.cshtml,Razor局部组件页面。
9、重构Nop.Web\Views\Shared\_Layout.cshtml,Razor页面:
<li class="dropdown">
@await Component.InvokeAsync("AdminHeaderLinks")
</li>
10、重构Nop.Web\Views\_ViewImports.cshtml,Razor页面:
@using Nop.Web.Framework.Models
@using Nop.Web
@using Nop.Web.Models
@using Nop.Web.Models.Common
11、按F5执行程序地址栏输入:https://localhost:44390/admin,可以直接跳转到后台管理的首页。
12、重构Nop.Web.Areas.Admin.Controllers.BaseAdminController类,在该类上定义标记:[AuthorizeAdmin]
13、按F5执行程序地址栏输入:https://localhost:44390/admin,这时就会因为没有执行登录操作,用户没有权限访问后台管理页面,程序将自动跳转到登录页面。输入用户名称和密码执行登录操作后,前台首页的菜单栏中将会显示出后台头部链接局部组件。点击后台头部链接局部组件菜单,跳转到后台管理的首页后,可以看出后台的客户菜单由于权限足够,所以被显示了出来。
对以上功能更为具体实现和注释见: 21-09-15_Nop_4.40.3(028_后台链接组件定义实现完成,所有页面正常显示)。
注意:
在nopCommerce程序中授权操作是由后台头部链接局部组件来控制实现的,即必须通过对台头部链接局部组件菜单的点击操作才能在登录操作后,跳转到后台管理的首页。这种实现方式,其实现逻辑态复杂,不态符合国内开发者对身份认证和授权的实现逻辑的实现习惯,总是有点不对味的感觉始终存在。