mirror of
https://github.com/mudler/LocalAI.git
synced 2026-04-01 13:42:20 -04:00
* feat(ui): add users and authentication support Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat: allow the admin user to impersonificate users Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * chore: ui improvements, disable 'Users' button in navbar when no auth is configured Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * feat: add OIDC support Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix: gate models Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * chore: cache requests to optimize speed Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * small UI enhancements Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * chore(ui): style improvements Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix: cover other paths by auth Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * chore: separate local auth, refactor Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * security hardening, approval mode Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * fix: fix tests and expectations Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * chore: update localagi/localrecall Signed-off-by: Ettore Di Giacinto <mudler@localai.io> --------- Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
50 lines
1.5 KiB
Go
50 lines
1.5 KiB
Go
package auth
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
// InitDB initializes the auth database. If databaseURL starts with "postgres://"
|
|
// or "postgresql://", it connects to PostgreSQL; otherwise it treats the value
|
|
// as a SQLite file path (use ":memory:" for in-memory).
|
|
// SQLite support requires building with the "auth" build tag (CGO).
|
|
func InitDB(databaseURL string) (*gorm.DB, error) {
|
|
var dialector gorm.Dialector
|
|
|
|
if strings.HasPrefix(databaseURL, "postgres://") || strings.HasPrefix(databaseURL, "postgresql://") {
|
|
dialector = postgres.Open(databaseURL)
|
|
} else {
|
|
d, err := openSQLiteDialector(databaseURL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dialector = d
|
|
}
|
|
|
|
db, err := gorm.Open(dialector, &gorm.Config{
|
|
Logger: logger.Default.LogMode(logger.Silent),
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to open auth database: %w", err)
|
|
}
|
|
|
|
if err := db.AutoMigrate(&User{}, &Session{}, &UserAPIKey{}, &UsageRecord{}, &UserPermission{}, &InviteCode{}); err != nil {
|
|
return nil, fmt.Errorf("failed to migrate auth tables: %w", err)
|
|
}
|
|
|
|
// Create composite index on users(provider, subject) for fast OAuth lookups
|
|
if err := db.Exec("CREATE INDEX IF NOT EXISTS idx_users_provider_subject ON users(provider, subject)").Error; err != nil {
|
|
// Ignore error on postgres if index already exists
|
|
if !strings.Contains(err.Error(), "already exists") {
|
|
return nil, fmt.Errorf("failed to create composite index: %w", err)
|
|
}
|
|
}
|
|
|
|
return db, nil
|
|
}
|