Browse Source

Localize exception messages in AbpAuthorizationModule..

pull/6509/head
maliming 6 years ago
parent
commit
f168fd27ca
  1. 19
      framework/src/Volo.Abp.Authorization/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions.cs
  2. 7
      framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj
  3. 15
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationErrorCodes.cs
  4. 20
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs
  5. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/AbpAuthorizationResource.cs
  6. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/en.json
  7. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/tr.json
  8. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json
  9. 49
      framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs
  10. 1
      framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj
  11. 4
      framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs
  12. 52
      framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureCheckerExtensions_Tests.cs

19
framework/src/Volo.Abp.Authorization/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions.cs

@ -95,7 +95,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(policyName))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted: " + policyName);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName)
.WithData("PolicyName", policyName);
}
}
@ -103,7 +104,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, requirement))
{
throw new AbpAuthorizationException("Authorization failed! Given requirement has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource)
.WithData("PolicyName", resource);
}
}
@ -111,7 +113,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, policy))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -119,7 +122,7 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(policy))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted.");
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted);
}
}
@ -127,7 +130,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, requirements))
{
throw new AbpAuthorizationException("Authorization failed! Given requirements have not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -135,7 +139,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, policyName))
{
throw new AbpAuthorizationException("Authorization failed! Given polist has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -149,4 +154,4 @@ namespace Microsoft.AspNetCore.Authorization
return abpAuthorizationService;
}
}
}
}

7
framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj

@ -19,7 +19,12 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization.Abstractions\Volo.Abp.Localization.Abstractions.csproj" />
<None Remove="Volo\Abp\Authorization\Localization\*.json" />
<EmbeddedResource Include="Volo\Abp\Authorization\Localization\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy\Volo.Abp.MultiTenancy.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
</ItemGroup>

15
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationErrorCodes.cs

@ -0,0 +1,15 @@
namespace Volo.Abp.Authorization
{
public static class AbpAuthorizationErrorCodes
{
public const string GivenPolicyHasNotGranted = "Volo.Authorization:010001";
public const string GivenPolicyHasNotGrantedWithPolicyName = "Volo.Authorization:010002";
public const string GivenPolicyHasNotGrantedForGivenResource = "Volo.Authorization:010003";
public const string GivenRequirementHasNotGrantedForGivenResource = "Volo.Authorization:010004";
public const string GivenRequirementsHasNotGrantedForGivenResource = "Volo.Authorization:010005";
}
}

20
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs

@ -3,11 +3,14 @@ using System.Collections.Generic;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Authorization.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Authorization
{
@ -38,6 +41,23 @@ namespace Volo.Abp.Authorization
options.ValueProviders.Add<RolePermissionValueProvider>();
options.ValueProviders.Add<ClientPermissionValueProvider>();
});
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpAuthorizationResource>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpAuthorizationResource>("en")
.AddVirtualJson("/Volo/Abp/Authorization/Localization");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("Volo.Authorization", typeof(AbpAuthorizationResource));
});
}
private static void AutoAddDefinitionProviders(IServiceCollection services)

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/AbpAuthorizationResource.cs

@ -0,0 +1,10 @@
using Volo.Abp.Localization;
namespace Volo.Abp.Authorization.Localization
{
[LocalizationResourceName("AbpAuthorization")]
public class AbpAuthorizationResource
{
}
}

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/en.json

@ -0,0 +1,10 @@
{
"culture": "en",
"texts": {
"Volo.Authorization:010001": "Authorization failed! Given policy has not granted.",
"Volo.Authorization:010002": "Authorization failed! Given policy has not granted: {PolicyName}",
"Volo.Authorization:010003": "Authorization failed! Given policy has not granted for given resource: {ResourceName}",
"Volo.Authorization:010004": "Authorization failed! Given requirement has not granted for given resource: {ResourceName}",
"Volo.Authorization:010005": "Authorization failed! Given requirements has not granted for given resource: {ResourceName}"
}
}

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/tr.json

@ -0,0 +1,10 @@
{
"culture": "tr",
"texts": {
"Volo.Authorization:010001": "Yetkilendirme başarısız oldu! Verilen politika verilmemiştir.",
"Volo.Authorization:010002": "Yetkilendirme başarısız oldu! Verilen politika vermedi: {PolicyName}",
"Volo.Authorization:010003": "Yetkilendirme başarısız oldu! Verilen politika, verilen kaynak için verilmemiştir: {ResourceName}",
"Volo.Authorization:010004": "Yetkilendirme başarısız oldu! Belirtilen kaynak için verilen şart verilmedi {ResourceName}",
"Volo.Authorization:010005": "Yetkilendirme başarısız oldu! Verilen gereksinimler, verilen kaynak için verilmemiştir: {ResourceName}"
}
}

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json

@ -0,0 +1,10 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.Authorization:010001": "授权失败! 提供的策略尚未授予.",
"Volo.Authorization:010002": "授权失败! 提供的策略尚未授予: {PolicyName}",
"Volo.Authorization:010003": "授权失败! 提供的策略未授予提供的资源: {ResourceName}",
"Volo.Authorization:010004": "授权失败! 提供的要求未授予提供的资源: {ResourceName}",
"Volo.Authorization:010005": "授权失败! 提供的要求未授予提供的资源: {ResourceName}"
}
}

49
framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs

@ -0,0 +1,49 @@
using Shouldly;
using Volo.Abp.AspNetCore.ExceptionHandling;
using Volo.Abp.Authorization;
using Volo.Abp.Localization;
using Xunit;
namespace Microsoft.AspNetCore.Authorization
{
public class AbpAuthorizationServiceExtensions_Tests : AuthorizationTestBase
{
private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter;
public AbpAuthorizationServiceExtensions_Tests()
{
_exceptionToErrorInfoConverter = GetRequiredService<IExceptionToErrorInfoConverter>();
}
[Fact]
public void Test_AbpAuthorizationException_Localization()
{
using (CultureHelper.Use("zh-Hans"))
{
var exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted);
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予.");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName)
.WithData("PolicyName", "my_policy_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予: my_policy_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略未授予提供的资源: my_resource_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name");
}
}
}
}

1
framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj

@ -12,6 +12,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.ExceptionHandling\Volo.Abp.ExceptionHandling.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Authorization\Volo.Abp.Authorization.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />

4
framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs

@ -2,12 +2,14 @@
using Volo.Abp.Authorization.TestServices;
using Volo.Abp.Autofac;
using Volo.Abp.DynamicProxy;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Modularity;
namespace Volo.Abp.Authorization
{
[DependsOn(typeof(AbpAutofacModule))]
[DependsOn(typeof(AbpAuthorizationModule))]
[DependsOn(typeof(AbpExceptionHandlingModule))]
public class AbpAuthorizationTestModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
@ -22,4 +24,4 @@ namespace Volo.Abp.Authorization
});
}
}
}
}

52
framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureCheckerExtensions_Tests.cs

@ -1,5 +1,4 @@
using System.Threading.Tasks;
using Shouldly;
using Shouldly;
using Volo.Abp.AspNetCore.ExceptionHandling;
using Volo.Abp.Authorization;
using Volo.Abp.Localization;
@ -9,51 +8,32 @@ namespace Volo.Abp.Features
{
public class FeatureCheckerExtensions_Tests : FeatureTestBase
{
private readonly IFeatureChecker _featureChecker;
private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter;
public FeatureCheckerExtensions_Tests()
{
_featureChecker = GetRequiredService<IFeatureChecker>();
_exceptionToErrorInfoConverter = GetRequiredService<IExceptionToErrorInfoConverter>();
}
[Fact]
public async Task CheckEnabledAsync()
public void Test_AbpAuthorizationException_Localization()
{
using (CultureHelper.Use("zh-Hans"))
{
var ex = await Assert.ThrowsAsync<AbpAuthorizationException>(async () =>
await _featureChecker.CheckEnabledAsync("BooleanTestFeature1"));
var errorInfo = _exceptionToErrorInfoConverter.Convert(ex, false);
errorInfo.Message.ShouldBe("功能未启用: BooleanTestFeature1");
}
}
[Fact]
public async Task CheckEnabled_RequiresAll()
{
using (CultureHelper.Use("zh-Hans"))
{
var ex = await Assert.ThrowsAsync<AbpAuthorizationException>(async () =>
await _featureChecker.CheckEnabledAsync(true, "BooleanTestFeature1", "BooleanTestFeature2"));
var errorInfo = _exceptionToErrorInfoConverter.Convert(ex, false);
errorInfo.Message.ShouldBe("必要的功能未启用. 这些功能需要启用: BooleanTestFeature1, BooleanTestFeature2");
}
}
[Fact]
public async Task CheckEnabled_Not_RequiresAll()
{
using (CultureHelper.Use("zh-Hans"))
{
var ex = await Assert.ThrowsAsync<AbpAuthorizationException>(async () =>
await _featureChecker.CheckEnabledAsync(false, "BooleanTestFeature1", "BooleanTestFeature2"));
var errorInfo = _exceptionToErrorInfoConverter.Convert(ex, false);
errorInfo.Message.ShouldBe("必要的功能未启用. 需要启用这些功能中的一项:BooleanTestFeature1, BooleanTestFeature2");
var exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.FeatureIsNotEnabled)
.WithData("FeatureName", "my_feature_name");
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("功能未启用: my_feature_name");
exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.AllOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", "my_feature_name, my_feature_name2");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("必要的功能未启用. 这些功能需要启用: my_feature_name, my_feature_name2");
exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.AtLeastOneOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", "my_feature_name, my_feature_name2");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("必要的功能未启用. 需要启用这些功能中的一项:my_feature_name, my_feature_name2");
}
}
}

Loading…
Cancel
Save