blob: 28b12810578286e58a1d3c7a5b7f4b397179f138 [file] [log] [blame]
import React, { useEffect, useState } from 'react';
import { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text, View } from 'react-native';
import { newEnforcer, StringAdapter, newModelFromString } from 'casbin';
const model = newModelFromString(`
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
`);
const adapter = new StringAdapter(`
p, alice, data1, read
p, bob, data2, write
`);
const Enforcer = ({ sub, obj, act }) => {
const [loading, setLoading] = useState(false);
const [result, setResult] = useState(false);
const [enforcer, setEnforcer] = useState(null);
useEffect(() => {
newEnforcer(model, adapter).then((e) => {
setEnforcer(e);
});
}, []);
useEffect(() => {
if (enforcer) {
setLoading(true);
enforcer
.enforce(sub, obj, act)
.then((res) => setResult(res))
.finally(() => setLoading(false));
}
}, [sub, obj, act, enforcer]);
return (
<View style={styles.container}>
<Text style={styles.h1}>Casbin</Text>
<Text style={styles.h2}>
Request ({sub}, {obj}, {act})
</Text>
{loading ? (
<Text>Enforcing...</Text>
) : (
<Text style={styles.resultText} testID="enforce-result">
{result === true ? 'Allowed' : 'Denied'}
</Text>
)}
<StatusBar style="auto" />
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
},
resultText: {
fontSize: 20,
fontWeight: 'bold',
padding: 20,
},
h1: {
padding: 20,
fontWeight: 'bold',
fontSize: 60,
},
h2: {
padding: 10,
fontSize: 20,
},
});
export default Enforcer;