Last active
August 29, 2015 14:10
-
-
Save jebberjeb/7a14d83344e4147f8f09 to your computer and use it in GitHub Desktop.
[TAKE 3] Rough cut at using core.logic to figure out user->roles->privileges access concerns.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns access.core | |
(:refer-clojure :exclude [==]) | |
(:require [clojure.core.logic :refer :all])) | |
(def all-priv [:smart-controls :view-all-reports :admin :foo :bar]) | |
(def all-roles [{:name :admin :privs priv} | |
{:name :reporting :privs [:view-all-reports]} | |
{:name :store :privs [:smart-controls :view-all-reports]} | |
{:name :foo-role :privs [:foo :bar]}]) | |
(def all-users [{:login "admin" :roles [:admin]} | |
{:login "jeb" :roles [:reporting :foo-role]} | |
{:login "eric" :roles [:store]}]) | |
;; 1. Who has access to _ ? | |
;; 2. Does _ have access to _ ? | |
;; 3. What does _ have access to ? | |
;; TODO should all-users and all-roles be params? | |
(defn accesso [priv login] | |
"(from the users) login has priv" | |
(fresh [?user ?role-names ?role-name ?privs ?role] | |
(== {:login login :roles ?role-names} ?user) | |
(membero ?user all-users) | |
(membero ?role-name ?role-names) | |
(== {:name ?role-name :privs ?privs} ?role) | |
(membero ?role all-roles) | |
(membero priv ?privs))) | |
;; Get logins that have access to :foo (1) | |
(run* [q] (accesso :foo q)) ;=> ("admin" "jeb") | |
;; Does _ have access to :foo? (2) | |
(run* [q] (accesso :foo "eric")) ;=> () | |
(run* [q] (accesso :foo "jeb")) ;=> (_0) | |
;; What does eric have access to? (3) | |
(run* [q] (accesso q "eric")) ;=> (:smart-controls :view-all-reports) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment