扩展的OrmLiteAuthRepository无法正确绑定

时间:2018-12-30 18:01:14

标签: servicestack

我扩展了OrmLiteAuthRepository类

在应用程序主机中,我将其注入到容器中。我使用requiredrole控制器对其进行测试,并且它从不调用用于自定义安全检查的方法。 即使我重定向到http://localhost:5000/?redirect=%2fRequiresRole#f=Unauthorized

所以我刚刚验证了应用程序启动时调用了主要的简单委托方。因此它正在使用我的clss。但不调用get \ haspermission方法。

    [RequiredRole("TheRole")]
    public class RequiresRoleController : ServiceStackController
    {
        public ActionResult Index()
        {
            var session = SessionAs<CustomUserSession>();
            return View(session);
        }
    }

using System;
using System.Collections.Generic;
using cbw.service.interfaces.Services;
using ServiceStack;
using ServiceStack.Auth;
using ServiceStack.Data;
using ServiceStack.Host;
using ServiceStack.Messaging;

namespace cbw.mvc.web.service.Providers
{
    public class MyOrmLiteAuthRepository : OrmLiteAuthRepository
    {
        public MyOrmLiteAuthRepository(IDbConnectionFactory dbFactory) : base(dbFactory) { }

        public MyOrmLiteAuthRepository(IDbConnectionFactory dbFactory, string namedConnnection = null)
            : base(dbFactory, namedConnnection)
        {
            DbFactory = dbFactory;
            NamedConnnection = namedConnnection;
        }

        public IDbConnectionFactory DbFactory { get; set; }
        public string NamedConnnection { get; set; }

        public override ICollection<string> GetPermissions(string userAuthId)
        {
            var permissions = base.GetPermissions(userAuthId);

            using (var ss = HostContext.ResolveService<SecurityService>(new BasicRequest()))
            {
                permissions = ss.UserPermissions(Convert.ToInt32(userAuthId));
            }

            return permissions;
        }


        public override bool HasPermission(string userAuthId, string permission)
        {
            var hasPermission = base.HasPermission(userAuthId, permission);

            using (var ss = HostContext.ResolveService<SecurityService>(new BasicRequest()))
            {
                hasPermission = ss.UserHasPermInRoleOrGroup(permission, Convert.ToInt32(userAuthId));
            }

            return hasPermission;
        }
    }
}






Apphost.cs

    using System;
    using System.Net;
    using cbw.mvc.web.service.Providers;
    using cbw.service.interfaces.Services;
    using cbw.service.interfaces.Validators;
    using cbw.service.models.Models;
    using ServiceStack;
    using ServiceStack.Auth;
    using ServiceStack.OrmLite;
    using ServiceStack.Caching;
    using ServiceStack.Data;
    using ServiceStack.Mvc;
    using ServiceStack.Text;
    using ServiceStack.Validation;

    namespace cbw.mvc.web.service
    {
        public class AppHost : AppHostBase
        {
            public AppHost() : base("ServiceStack + .NET Core", typeof(StartupService).Assembly) { }

            public override void Configure(Funq.Container container)
            {
                Plugins.Add(new RazorFormat());

                //Works but recommend handling 404 at end of .NET Core pipeline
                //this.CustomErrorHttpHandlers[HttpStatusCode.NotFound] = new RazorHandler("/notfound");
                this.CustomErrorHttpHandlers[HttpStatusCode.Unauthorized] = new RazorHandler("/login");

                //To include null values in the json globally
                JsConfig.IncludeNullValues = true;
                //This is mandate. We need "IncludeNullValuesInDictionaries = true" to include null values
                JsConfig.IncludeNullValuesInDictionaries = true;

                //To automatically wired up for you on all HTTP Verbs (GET, POST, etc) 
                //And built-in endpoints, i.e. JSON, XML, JSV, HTML, CSV, SOAP
                Plugins.Add(new CorsFeature());

                //To add registration feature
                Plugins.Add(new RegistrationFeature());

                //To add validation feature
                Plugins.Add(new ValidationFeature());
                container.RegisterValidators(
                    typeof(InsertCompanyValidator).Assembly,
                    typeof(UpdateCompanyValidator).Assembly,
                    typeof(DeleteCompanyValidator).Assembly
                    );

                Plugins.Add(new AuthFeature(() => new CustomUserSession(),
                    new IAuthProvider[]
                    {
                        new CredentialsAuthProvider(),              //HTML Form post of UserName/Password credentials
                        new BasicAuthProvider(),                    //Sign-in with HTTP Basic Auth
                        new DigestAuthProvider(AppSettings),        //Sign-in with HTTP Digest Auth
                        new TwitterAuthProvider(AppSettings),       //Sign-in with Twitter
                        new FacebookAuthProvider(AppSettings),      //Sign-in with Facebook
                        new GithubAuthProvider(AppSettings),        //Sign-in with GitHub OAuth Provider
                        new GoogleAuthProvider(AppSettings),        //Sign-in with Google OAuth Provider
                        new YandexAuthProvider(AppSettings),        //Sign-in with Yandex OAuth Provider        
                        new VkAuthProvider(AppSettings),            //Sign-in with VK.com OAuth Provider 
                    })
                {
                    HtmlRedirect = "/",
                    //IncludeRegistrationService = true,
                });

                // i.e. Register in Memory Cache Client

                //AutoQuery
                Plugins.Add(new AutoQueryFeature { MaxLimit = 100000 });

                container.Register<IAuthRepository>(c =>
                    new MyOrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>())
                    {
                        UseDistinctRoleTables = AppSettings.Get("UseDistinctRoleTables", true),
                    });
    ;
                bool ShouldWipeAndReloadDb = false;
                var environmentVariable = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

                if (environmentVariable == "LocalMemory" || environmentVariable == "LocalSQLServer")
                {
                    ShouldWipeAndReloadDb = true;
                    //Init auth tables
                    container.Resolve<IAuthRepository>().InitSchema();
                }
                var authRepo = (MyOrmLiteAuthRepository)container.Resolve<IAuthRepository>();

                //Wipe and reload if using in memory SQL
                if (ShouldWipeAndReloadDb)
                {
                    DatabaseInitService dis = new DatabaseInitService();
                    dis.ResetDatabase();
                    SessionService.ResetUsers(authRepo);
                    dis.InitializeTablesAndData();
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您使用的是[RequiredRole],但是您只覆盖了HasPermission / GetPermissions API,因此您需要覆盖HasRole / GetRoles API。