Log & gestion des erreurs
Journalisationâ
Casbin utilise le log intégré
pour afficher les logs dans la console par défaut comme :
2017/07/15 19:43:56 [Demande: alice, data1, read ---> true]
La journalisation n'est pas activée par défaut. Vous pouvez le basculer via Enforcer.EnableLog()
ou le dernier paramĂštre de NewEnforcer()
.
Nous soutenons déjà l'enregistrement du modÚle, l'application de la demande, le rÎle, la politique dans Golang. Vous pouvez définir votre propre journal de connexion Casbin. Si vous utilisez Python, pycasbin utilise le mécanisme de journalisation par défaut de Python. Le paquet pycasbin fait un appel à logging.getLogger() pour définir le logger. Aucune configuration spéciale de journalisation n'est nécessaire autre que l'initialisation du logger dans l'application parente. Si aucune trace n'est intitilisée dans l'application parente, vous ne verrez aucun message de log de pycasbin.
Utiliser un enregistreur diffĂ©rent pour diffĂ©rents agents de sĂ©curitĂ©â
Chaque responsable pouvait avoir son propre enregistreur pour enregistrer des informations, et il pourrait ĂȘtre modifiĂ© au moment de l'exĂ©cution.
And you could use a proper logger via the last paramter of NewEnforcer()
, if you using this way to initialize your enforcer, you needn't use the enabled parameter, cause the priority of the enabled field in logger is higher.
// Définit un enregistreur par défaut en tant que enregistreur d'e1.
// Cette opĂ©ration pourrait Ă©galement ĂȘtre considĂ©rĂ©e comme le changement du logger de e1 Ă l'exĂ©cution.
e1.SetLogger(&Log.DefaultLogger{})
// Définit un autre enregistreur en tant que enregistreur de l'agent de sécurité e2.
e2.SetLogger(&YouOwnLogger)
// DĂ©finit votre logger lors de l'initialisation de enforcer e3.
e3, _ := casbin.NewEnforcer("examples/rbac_model.conf", a, logger)
Enregistreurs pris en chargeâ
Nous fournissons des loggeurs pour vous aider Ă enregistrer des informations.
- Go
- PHP
Logger | Auteur | Description |
---|---|---|
Désamorçage (intégré) | Casbin | Le logger par défaut en utilisant le log golang. |
Zap logger | Casbin | En utilisant zap, fournissez des journaux encodés en json et vous pourriez personnaliser davantage avec votre propre enregistreur zap. |
Logger | Auteur | Description |
---|---|---|
logger psr3-bridge | Casbin | Fournit un pont de connexion PSR-3. |
Comment Ă©crire un loggerâ
Votre logger devrait implémenter l'interface Logger.
MĂ©thode | Type de texte | Description |
---|---|---|
EnableLog() | mandatory | ContrÎle si le message est affiché. |
IsEnabled() | mandatory | Afficher le statut actif du logger. |
LogModel() | mandatory | Informations de log relatives au modĂšle. |
LogEnforce() | mandatory | Informations de log relatives Ă la mise en application. |
LogRole() | mandatory | Informations de log relatives au rĂŽle. |
Politique() de logg() | mandatory | Informations de log relatives Ă la politique. |
Vous pouvez passer votre log personnalisé
Ă Enforcer.SetLogger()
.
Voici un exemple sur la façon de personnaliser un logger pour Golang:
import (
"fmt"
"log"
"strings"
)
// DefaultLogger est l'implémentation d'un Logger en utilisant le log golang.
type DefaultLogger struct {
enabled bool
}
func (l *DefaultLogger) EnableLog(enable bool) {
l. nabled = enable
}
func (l *DefaultLogger) IsEnabled() bool {
return l.enabled
}
func (l *DefaultLogger) LogModel(model [][]string) {
if !l. nabled {
return
}
var str strings.Builder
str. riteString("ModĂšle: ")
pour _, v := range model {
str. riteString(fmt.Sprintf("%v\n", v))
}
log.Println(str. tring())
}
func (l *DefaultLogger) LogEnforce(matcher string, request []interface{}, result bool, explains [][]string) {
if !l. {
return
}
var reqStr strings.Builder
reqStr. riteString("RequĂȘte: ")
pour i, rval := range request {
if i ! len(request)-1 {
reqStr. riteString(fmt. printf("%v, ", rval))
} else {
reqStr. riteString(fmt. printf("%v", rval))
}
}
reqStr. riteString(fmt.Sprintf(" ---> %t\n", résultat))
reqStr. riteString("Politique de frappe: ")
pour i, pval := intervalle explique {
si i ! len(expliques)-1 {
reqStr. riteString(fmt. printf("%v, ", pval))
} else {
reqStr. riteString(fmt. printf("%v \n", pval))
}
}
log. rintln(reqStr. tring())
}
func (l *DefaultLogger) LogPolicy(policy map[string][][]string) {
if !l. format@@0 nabled {
return
}
var str strings. uilder
str. riteString("Policy: ")
for k, v := range policy {
str.WriteString(fmt. printf("%s : %v\n", k, v))
}
log.Println(str. tring())
}
func (l *DefaultLogger) LogRole(roles []string) {
if !l. {
return
}
log.Println("RĂŽles : ", rĂŽles)
}
Gestion des erreursâ
Une erreur ou une panique peut se produire lorsque vous utilisez Casbin pour des raisons comme :
- Syntaxe invalide dans le fichier modĂšle (.conf).
- Syntaxe invalide dans le fichier de régulation (.csv).
- Erreur personnalisée des adaptateurs de stockage, par exemple MySQL ne parvient pas à se connecter.
- Casbin's bug.
Il y a cinq fonctions principales dont vous devrez peut-ĂȘtre vous soucier pour les erreurs ou la panique :
Fonction | Comportement en cas d'erreur |
---|---|
NewEnforcer() | Erreur de retour |
format@@0 LoadModel() | Erreur de retour |
format@@0 LoadPolicy() | Erreur de retour |
EnregistrerPolicy() | Erreur de retour |
Forcer() | Erreur de retour |
NewEnforcer()
appelle LoadModel()
et LoadPolicy()
à l'intérieur. Donc, vous n'avez pas à appeler les deux derniers appels en utilisant la fonction NewEnforcer()
.
Activer & dĂ©sactiverâ
Le responsable peut ĂȘtre dĂ©sactivĂ© via la fonction Enforcer.EnableEnforce()
. Quand elle est désactivée, Enforcer.Enforce()
retournera toujours true
. D'autres opérations telles que l'ajout ou la suppression de la politique ne sont pas affectées. Voici un exemple :
e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
// retournera false.
// Par défaut, le responsable est activé.
e.Enforce("non-authorized-user", "data1", "read")
// Désactive le responsable à l'exécution.
e.EnableEnforce(false)
// Renvoie vrai pour toute requĂȘte.
e.Enforce("non-authorized-user", "data1", "read")
// Activez le responsable Ă nouveau.
e.EnableEnforce(true)
// retournera false.
e.Enforce("non-autorised-user", "data1", "read")