Proposal: Generic type's policy and request
@sagilio ci sta già lavorando.
Dal 21/11/2021.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
Context and purposes
Casbin uses a string array to store all policies, so we have ensured the request is always a string. In some situations, we need additional operations to "parse" request values: https://github.com/casbin/casbin/issues/868.
However, this does bring some benefits, all as strings can greatly reduce the complexity of development. like we can provide a clear signature for the custom function:
// golang
func (key1 string, key2 string) bool
// csharp
Func<string, string, bool>
So this proposal does not completely make the parameters strongly typed, currently only for the following purposes :
- Validate matcher when loading model.
- Lower memory allocation and boxed conversion.
- Provider better ABAC support, like higher performance.
- Prepare for future semantic expansion, like auto-type parse.
Roadmap
- https://github.com/casbin/Casbin.NET/issues/94 (Will be included to v2.0)
- https://github.com/casbin/Casbin.NET/issues/226
- https://github.com/casbin/Casbin.NET/issues/227
- https://github.com/casbin/Casbin.NET/issues/228
Changes:
1. Generic request and policy values
Request and policy value is like a read-only tuple. We can use the record Request<T1, T2 ...> type to define them. In order to deal with the different numbers and usage scenarios of policies and requests (the request will be much more than policy), so the request should be lower allocated than the policy instance and try best to avoid boxed-transform.
Policy Sample:
public record Policy<T1, T2, T3>(T1 Value1, T2 Value2, T3 Value3) : IPolicyValues
{
public string this[int index] => index switch
{
0 => Policy.ToString(Value1),
1 => Policy.ToString(Value2),
2 => Policy.ToString(Value3),
_ => throw new ArgumentOutOfRangeException(nameof(index))
};
public int Count => 3;
public IEnumerator<string> GetEnumerator() => new PolicyEnumerator<Policy<T1, T2, T3>>(this);
IEnumerator IEnumerable.GetEnumerator() => new PolicyEnumerator<Policy<T1, T2, T3>>(this);
};
Request sample:
public readonly record struct Request<T1, T2, T3>(T1 Value1, T2 Value2, T3 Value3) : IRequestValues
{
public int Count => 3;
public static implicit operator Request<T1, T2, T3>((T1, T2, T3) tuple)
{
return Request.Create(tuple.Item1, tuple.Item2, tuple.Item3);
}
public static implicit operator (T1, T2, T3)(Request<T1, T2, T3> r)
{
return (r.Value1, r.Value2, r.Value3);
}
}
2. Expression and matcher
These will help implement a “real matcher”, we do not need the escaping:
https://github.com/casbin/Casbin.NET/blob/bb8b51b43ed2c49f6e8ca70929f609a71cef2f74/NetCasbin/Util/StringUtil.cs#L18-L27
Sample test:
[Fact]
public void TestGenericEnforce()
{
var r = Request.Create("A", 1);
var p = Policy.Create("A", 1);
var func1 = Compile("r.Value1 == p.Value1 && r.Value2 == p.Value2",
nameof(r), in r, nameof(p), in p);
Assert.True(func1(Request.Create("A", 1), Policy.Create("A", 1)));
Assert.False(func1(Request.Create("A", 1), Policy.Create("A", 2)));
Assert.False(func1(Request.Create("B", 1), Policy.Create("B", 2)));
var r2 = Request.Create("A", 1, "read");
var p2 = Policy.Create("A", 1, "read");
var func2 = Compile("r2.Value1 == p2.Value1 && r2.Value2 == p2.Value2 && r2.Value3 == p2.Value3",
nameof(r2), in r2, nameof(p2), in p2);
Assert.True(func2(Request.Create("A", 1, "read"), Policy.Create("A", 1, "read")));
Assert.False(func2(Request.Create("A", 1, "read"), Policy.Create("A", 2, "read")));
Assert.False(func2(Request.Create("B", 1, "read"), Policy.Create("B", 2, "read")));
}
- Lingua principale
- C#
- Stelle
- 1.3k
- Fork
- 129
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/casbin-Casbin.NET
-
Refactor default role managerForse di nuovo libera @hsluoyz l’ha presa 1669 giorni fa e non c’è nessuna pull request aperta. Apertaenhancement help wanted
apache/casbin-Casbin.NET#250 · 1 commento · 2 assegnatari ·
-
Improve policy synchronization workflow of IAdapterForse di nuovo libera @sagilio l’ha presa 1945 giorni fa e non c’è nessuna pull request aperta. Apertaenhancement
apache/casbin-Casbin.NET#184 · 1 assegnatario ·
-
Improve the unit test coverageForse di nuovo libera @sagilio l’ha presa 2030 giorni fa e non c’è nessuna pull request aperta. Apertaenhancement help wanted
apache/casbin-Casbin.NET#151 · 1 commento · 1 assegnatario ·
-
Add cancellation token optional argument supportForse di nuovo libera @sagilio l’ha presa 2042 giorni fa e non c’è nessuna pull request aperta. Apertanew feature
apache/casbin-Casbin.NET#145 · 1 assegnatario ·
-
Rule Indexing featureForse di nuovo libera @sagilio l’ha presa 2074 giorni fa e non c’è nessuna pull request aperta. Apertanew feature
apache/casbin-Casbin.NET#132 · 1 assegnatario ·
Tutte le issue di apache/casbin-Casbin.NET
Issue simili
-
area:jobads-cv BE P3
Difficoltà 1/5 1-3 ore Idoneità per principianti 74/100
klasolsson81/jobbliggaren#2240 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
k2-fsa/sherpa-onnx#4100 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
unoplatform/uno.check#591 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
weaviate/csharp-client#378 ·
-
area:repo devops elsa 3 prio medium triaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
elsa-workflows/elsa-core#9098 ·
I maintainer di solito rispondono entro 1 giorno