EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:在非XAF应用程序中使用安全系统的集成模式

本主题演示如何从控制台应用程序访问由安全系统集成模式)保护的数据。

先决条件

  1. 您拥有一个XAF解决方案(例如XafSolution),该解决方案具有与平台无关的模块以及WinForms或ASP.NET应用程序项目
  2. 该解决方案使用XPO作为ORM系统。
  3. WinForms或ASP.NET应用程序使用安全系统和标准身份验证的集成模式。
  4. 有一个活动用户,其名称为“用户”,密码为空。
  5. 业务对象在XafSolution.Module项目中定义(例如EmployeeDepartment)。
  6. 将为这些业务对象生成一个数据库(XafSolution)。

创建和配置非XAF应用程序

  1. 创建一个控制台应用程序。

  2. 将以下代码添加到应用程序的配置文件(App.config)中以设置连接字符串。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="ConnectionString" connectionString="Data Source=DBSERVER;Initial Catalog=XafSolution;Integrated Security=True"/>
      </connectionStrings>
      <!-- ... -->
    </configuration>
    

    DBSERVER替换为数据库服务器名称或其IP地址。例如对于本地数据库服务器使用localhost(本地)

  3. 参考以下程序集:

    • XafSolution.Module.dll
    • System.Configuration.dll
    • DevExpress.ExpressApp.v 19.2 .dll
    • DevExpress.ExpressApp.Security.v 19.2 .dll
    • DevExpress.ExpressApp.Security.Xpo.v 19.2 .dll
    • DevExpress.ExpressApp.Xpo.v 19.2 .dll
    • DevExpress.Persistent.BaseImpl.v 19.2 .dll

访问安全数据

在控制台应用程序的Program.csProgram.vb)文件中执行以下步骤。

  1. 初始化类型信息系统,并使用RegisterEntity(Type)方法注册应在此应用程序中可访问的业务对象。

    using DevExpress.ExpressApp;
    using DevExpress.ExpressApp.Xpo;
    using DevExpress.Persistent.BaseImpl.PermissionPolicy;
    using XafSolution.Module.BusinessObjects;
    //...
    static void Main(string[] args) {
        RegisterEntities();
        // ...
    }
    private static void RegisterEntities()        {
        XpoTypesInfoHelper.GetXpoTypeInfoSource();
        XafTypesInfo.Instance.RegisterEntity(typeof(Employee));
        XafTypesInfo.Instance.RegisterEntity(typeof(Department));
        XafTypesInfo.Instance.RegisterEntity(typeof(PermissionPolicyUser));
        XafTypesInfo.Instance.RegisterEntity(typeof(PermissionPolicyRole));
    }
    
  2. 初始化安全系统。

    using DevExpress.ExpressApp.Security;
    // ...
    AuthenticationStandard authentication = new AuthenticationStandard();
    SecurityStrategyComplex security = new SecurityStrategyComplex(typeof(PermissionPolicyUser), typeof(PermissionPolicyRole), authentication);
    security.RegisterXPOAdapterProviders();
    
  3. 创建SecuredObjectSpaceProvider对象。它允许您登录并创建SecuredObjectSpace来访问受保护的数据。

    using System.Configuration;
    using DevExpress.ExpressApp.Security.ClientServer;
    // ...
    string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    SecuredObjectSpaceProvider objectSpaceProvider = new SecuredObjectSpaceProvider(security, connectionString, null);
    
  4. 执行登录。

    string userName = "User";
    string password = string.Empty;
    authentication.SetLogonParameters(new AuthenticationStandardLogonParameters(userName, password));
    IObjectSpace loginObjectSpace = objectSpaceProvider.CreateObjectSpace();
    security.Logon(loginObjectSpace);
    
  5. 创建SecuredObjectSpace对象以处理受保护的数据。

    using System.Text;
    // ...
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.Append("List of the 'Employee' objects:\n");
    using(IObjectSpace securedObjectSpace = objectSpaceProvider.CreateObjectSpace()) {
        foreach(Employee employee in securedObjectSpace.GetObjects<Employee>()) {
            stringBuilder.Append(string.Format("Full name: {0}\n", employee.FullName));
            if(security.IsGranted(new PermissionRequest(securedObjectSpace, typeof(Employee), SecurityOperations.Read, employee, "Department"))) {
                stringBuilder.Append(string.Format("Department: {0}\n", employee.Department.Title));
            }
            else {
                stringBuilder.Append("Department: [Protected content]\n");
            }
        } 
    }
    

    如果不允许用户读取属性,则安全对象空间将返回属性默认值。使用IsGranted(IPermissionRequest)方法显示“受保护的内容”占位符而不是此值。

重点

确保非XAF应用程序中的静态EnableRfc2898和SupportLegacySha512属性具有与设置了密码的XAF应用程序中相同的值。否则,您将无法登录。

相关文章

转载保留此链接,注明出处