vue-cancan
Version:
Vue.js integration with Rails CanCan authorization library
53 lines (44 loc) • 1.49 kB
JavaScript
function checkAction(abilityAction, checkedAction) {
return (abilityAction == 'manage') ||
(abilityAction == checkedAction) ||
(abilityAction == 'read' && (checkedAction == 'index' || checkedAction == 'show'));
}
function checkSubject(abilitySubject, checkedSubject) {
return (abilitySubject == 'all') ||
(abilitySubject == checkedSubject);
}
export default {
$can(action, subject) {
return this.rules.find((ability) => {
return ability.base_behavior &&
ability.subjects.find((abilitySubject) => checkSubject(abilitySubject, subject)) &&
ability.actions.find((abilityAction) => checkAction(abilityAction, action));
}) && true;
},
setRules(rules) {
this.rules = rules;
},
install(Vue, options) {
this.rules = options.rules;
Vue.prototype.$can = (action, subject) => this.$can(action, subject);
Vue.prototype.setRules = (rules) => this.setRules(rules);
Vue.directive('can', {
inserted: (el, binding) => {
if(!this.$can(Object.keys(binding.modifiers)[0], Object.keys(binding.modifiers)[1])) {
el.remove();
}
}
});
},
navigationGuard(defaultPath) {
return (to, from, next) => {
const subject = to.path.replace(/^\//, '').split('/')[0] || 'index';
const action = to.path.replace(/^\//, '').split('/')[1] || 'index';
if(this.$can(action, subject)) {
next()
} else {
next(defaultPath);
}
}
}
}