Tutorial 9~20 MinutenMittel

Security & Roles

Sichere deine APIs mit Rollen, Privacy-Annotations und dem integrierten Security-Scanner von Velisch.

Was du lernen wirst

  • Rollenbasierte Zugriffskontrolle (RBAC)
  • Privacy-Annotations für DSGVO
  • Security-Decorators anwenden
  • Automatische Schwachstellen-Erkennung
1

Security First

Velisch hat Sicherheit im Kern verankert. Der Compiler scannt automatisch nach SQL-Injections, Secret-Leaks und anderen Schwachstellen.

Automatischer Scan

SQL-Injection & Secret-Leak-Erkennung

RBAC

Rollenbasierte Zugriffskontrolle

Privacy

Native DSGVO-Unterstützung

2

DSGVO & Privacy

Mit @Privacy markierst du sensible Felder, die automatisch in API-Responses verschleiert werden.

struct User {
    id: string,
    name: string,
    
    @Privacy
    email: string,      // Wird als "a***@example.com" ausgegeben
    
    @Privacy
    phone: string,      // Wird als "+49***123" ausgegeben
    
    @Privacy(mask: "****")
    ssn: string,        // Wird als "****" ausgegeben
}

@GET("/api/users/:id")
fn getUser(id: string): User {
    // Email und Phone werden automatisch verschleiert
    return db.find(User, id);
}

// Response:
// {
//   "id": "123",
//   "name": "Anna Schmidt",
//   "email": "a***@example.com",
//   "phone": "+49***456"
// }

// Für Admin-Zugriff: @IgnorePrivacy
@Auth
@Role("admin")
@IgnorePrivacy
@GET("/api/admin/users/:id")
fn getFullUser(id: string): User {
    // Admin sieht alle Daten unverschleiert
    return db.find(User, id);
}
3

Rollenbasierter Zugriff

Kombiniere @Auth und@Role für feingranulare Zugriffskontrolle.

// Nur eingeloggte User
@Auth
@GET("/api/profile")
fn getProfile(): User {
    return currentUser();
}

// Nur für Admins
@Auth
@Role("admin")
@DELETE("/api/users/:id")
fn deleteUser(id: string): void {
    db.delete(User, id);
}

// Mehrere Rollen erlaubt
@Auth
@Role("admin", "moderator")
@PUT("/api/posts/:id/approve")
fn approvePost(id: string): Post {
    let post = db.find(Post, id);
    post.status = "approved";
    return db.save(post);
}

// Eigene Ressourcen
@Auth
@Owner("userId")  // Nur der Besitzer darf zugreifen
@GET("/api/orders/:id")
fn getOrder(id: string): Order {
    return db.find(Order, id);
}
4

Security-Scanner

Der integrierte Scanner prüft deinen Code bei jeder Kompilierung auf Schwachstellen:

// ❌ WARNUNG: Potentielle SQL-Injection
fn unsafeQuery(userId: string): List<User> {
    return db.rawQuery("SELECT * FROM users WHERE id = " + userId);
}

// ✅ SICHER: Parametrisierte Query
fn safeQuery(userId: string): List<User> {
    return db.query(User).where("id", "=", userId).findAll();
}

// ❌ WARNUNG: Secret im Code
let apiKey = "sk-1234567890abcdef";

// ✅ SICHER: Environment Variable
let apiKey = env.API_KEY;

// Scanner-Ausgabe bei `velin build`:
// ⚠️  [SECURITY] Possible SQL injection at main.velin:12
// ⚠️  [SECURITY] Hardcoded secret detected at main.velin:16
// ✅  Security scan passed with 2 warnings

Zusammenfassung

Was du gelernt hast:

  • @Privacy für DSGVO-Konformität
  • @Auth und @Role für RBAC
  • Automatischer Security-Scanner

Nächste Schritte:

  • Authentifizierung mit JWT/OAuth2