1

我有 Fluent Security 设置(和工作)来保护我的控制器操作,并使用 Castle Windsor 来解决所有问题(几乎如您可以下载的 castlewindsor-fluentsecurity 项目中所示)。我现在要做的是创建一个在我们的 Active Directory 上运行查询的自定义策略。我创建了一个实现 ISecurityPolicy 的测试策略,但它没有默认构造函数,因为我需要注入接口来访问 AD。这是政策:-

 public class TestPolicy : ISecurityPolicy
{
    private readonly IQueryHandler<GetUserQuery, User> userQueryHandler;

    public TestPolicy(IQueryHandler<GetUserQuery, User> userQueryHandler)
    {
        this.userQueryHandler = userQueryHandler;
    }
    public PolicyResult Enforce(ISecurityContext context)
    {
        var adUser = userQueryHandler.Handle(new GetUserQuery());

        if (adUser.HasManager())
        {
            return PolicyResult.CreateSuccessResult(this);
        }
        return PolicyResult.CreateFailureResult(this, "Access denied!");
    }
}

IQueryHandler 在其他地方使用并正确解析。我将策略添加到控制器:-

configuration.For<Areas.People.Controllers.InfoController>().AddPolicy<TestPolicy>();

但是当调用它时失败:-无法加载TestPolicy!确保策略有一个空的构造函数或在你的 IoC 容器中注册。现在查看文档,我似乎错过了告诉 SecurityConfigurator 我正在使用 IoC 的步骤。文档没有显示特定的温莎城堡示例,但我“想出了”:-

SecurityConfigurator.Configure(configuration => configuration.ResolveServicesUsing(type => _container.ResolveAll(type).Cast<object>()));

好吧,它不起作用,当 SecurityConfig.RegisterSecurityRules() 被调用时,SecurityConfigurator 需要 Castle Windsor 容器似乎很奇怪,我已经完成了 Castle Windsor。谁能告诉我在这种情况下我应该如何配置 Fluent Security?

4

1 回答 1

1

好的 - 我终于让它工作了:
在 SecurityConfigurator 中,
configuration.ResolveServicesUsing( type => container.ResolveAll(type).Cast<object>(), type => container.Kernel.HasComponent(type) ? container.Resolve(type) : null );
我更改了控制器策略以添加一个接口,而不是一个实际的策略:

configuration.For<Areas.People.Controllers.InfoController>().AddPolicy<ITestPolicy>();


该接口实现 ISecurityPolicy:

    public interface ITestPolicy : ISecurityPolicy
{
}


然后接口可以与 Castle 连接起来:

container.Register(Component.For<ITestPolicy>().ImplementedBy<TestPolicy>());


我认为 Fluent Docs 中的自定义策略示例可以说您需要使用策略接口,以便 CastleWindsor 可以解决它......(除非我使用错了!)

于 2014-11-06T12:49:03.997 回答