This example demonstrates the event listener system in Sa-Token-Go.
- Simple Function Listeners - Quick way to register event handlers
- Wildcard Listeners - Listen to all events
- Priority-Based Execution - Control listener execution order
- Synchronous vs Asynchronous - Choose blocking or non-blocking listeners
- Panic Recovery - Handle listener errors gracefully
- Dynamic Registration - Add/remove listeners at runtime
- Event Enable/Disable - Control which events are active
go run main.go=== Sa-Token-Go Event Listener Example ===
--- Triggering Events ---
[AUDIT] Login audit - User: 1000, Time: 1697234567
[ALL EVENTS] Event{type=login, loginID=1000, device=, timestamp=1697234567}
[LOGIN] User 1000 logged in with token abc123def456...
[AUDIT] Login audit - User: 2000, Time: 1697234568
[ALL EVENTS] Event{type=login, loginID=2000, device=, timestamp=1697234568}
[LOGIN] User 2000 logged in with token xyz789...
[ALL EVENTS] Event{type=logout, loginID=1000, device=, timestamp=1697234569}
[LOGOUT] User 1000 logged out
[ALL EVENTS] Event{type=kickout, loginID=2000, device=, timestamp=1697234570}
[KICKOUT] User 2000 was forcibly logged out
--- Listener Statistics ---
Total listeners: 5
Login listeners: 2
Logout listeners: 1
--- Unregistering audit logger ---
Audit logger unregistered successfully
Remaining listeners: 4
--- Disabling kickout events ---
--- Testing event disable (this should not trigger kickout listener) ---
[ALL EVENTS] Event{type=login, loginID=3000, device=, timestamp=1697234571}
[LOGIN] User 3000 logged in with token...
=== Example Complete ===
In this example the authentication manager automatically owns an internal event manager:
manager := core.NewBuilder().
Storage(memory.NewStorage()).
Build()
eventMgr := manager.GetEventManager() // Advanced controls (stats, enable/disable, panic handler, ...)The simplest way to register an event handler:
manager.RegisterFunc(core.EventLogin, func(data *core.EventData) {
fmt.Printf("User %s logged in\n", data.LoginID)
})Control execution order with priorities:
manager.RegisterWithConfig(core.EventLogin,
myListener,
core.ListenerConfig{
Priority: 100, // Higher = executes first
Async: false, // Synchronous execution
},
)Listen to all events:
manager.RegisterFunc(core.EventAll, func(data *core.EventData) {
// This will be called for every event
})Add and remove listeners at runtime:
// Register with custom ID
id := manager.RegisterWithConfig(event, listener, core.ListenerConfig{
ID: "my-listener",
})
// Later, unregister
manager.Unregister(id)manager.RegisterFunc(core.EventAll, func(data *core.EventData) {
auditLog.Write(fmt.Sprintf("[%s] %s - %s",
data.Event, data.LoginID, time.Unix(data.Timestamp, 0)))
})manager.RegisterFunc(core.EventKickout, func(data *core.EventData) {
alertSystem.Send(fmt.Sprintf("User %s was kicked out", data.LoginID))
})manager.RegisterFunc(core.EventLogin, func(data *core.EventData) {
analytics.Track("user_login", map[string]interface{}{
"user_id": data.LoginID,
"device": data.Device,
})
})manager.RegisterFunc(core.EventLogout, func(data *core.EventData) {
cache.Delete("user:" + data.LoginID)
})- Listener Guide - Complete listener documentation
- Authentication Guide - Authentication basics
- API Reference - API documentation