Giới thiệu về Keycloak - Giải pháp cho quản lý đăng nhập, xác thực và phân quyền
Lý thuyết
Giới thiệu tổng quan
Keycloak là một giải pháp quản lý danh tính tập trung, do Red Hat phát triển, hỗ trợ
- Single Sign-On (SSO): Người dùng chỉ cần đăng nhập một lần để truy cập nhiều ứng dụng.
- OAuth2, OIDC, SAML 2.0: Đầy đủ các tiêu chuẩn xác thực hiện đại.
- User Management: Tạo user, nhóm, vai trò, đặt password policy, khóa tài khoản, TOTP/2FA…
- Identity Brokering & Social Login: Cho phép đăng nhập bằng Google, Facebook, GitHub…
- Client & Resource Permissions (RBAC/ABAC): Phân quyền theo role hoặc theo resource.
- Admin Console & Account Console: Giao diện trực quan giúp quản lý dễ dàng.
Các thành phần chính của Keycloak
- Realm – Tập hợp user, client, role, policy (giống 1 tenant)
- Client – Ứng dụng kết nối với Keycloak (web, backend, mobile)
- Users – Tài khoản người dùng
- Roles/Groups – Phân quyền
- Identity Providers – Google, SAML IdP, Azure AD…
- User Federation – Kết nối LDAP/AD để đồng bộ user
Thực hành
Chạy Keycloak với Docker và kết nối với Database riêng
Chuẩn bị: Máy có cài docker
File docker-compose.yml:
services:
maria-db:
image: mariadb:12.0
container_name: mariadb
ports:
- "3307:3306"
environment:
MARIADB_ROOT_PASSWORD: secret
MARIADB_DATABASE: keycloak
MARIADB_USER: keycloak
MARIADB_PASSWORD: secret
networks:
- keycloak-network
keycloak:
image: quay.io/keycloak/keycloak:26.4.4
container_name: keycloak
ports:
- "8080:8080"
command: start-dev
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
KC_DB: mariadb
KC_DB_URL: jdbc:mariadb://mariadb:3306/keycloak
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD: secret
KC_HTTP_ENABLED: "true"
KC_HOSTNAME_STRICT: "false"
KC_PROXY: "edge"
depends_on:
- maria-db
networks:
- keycloak-network
networks:
keycloak-network:
driver: bridge
Giải thích:
- Trong file docker-compose trên chúng ta khai báo 2 container là: mariadb và keycloak
- Trong mục enviroment của keycloak, chúng ta khai báo 3 biến là: KC_DB, KC_DB_URL, KC_DB_USERNAME, KC_DB_PASSWORD. Giúp keycloak dùng mariadb là database để lưu trữ dữ liệu
- Khai báo networks là keycloak-network để 2 container join vào và sử dụng chung mạng kết nối này
Chạy 2 container bằng docker compose
Chạy câu lệnh:
docker compose up
Mở docker desktop và xem thành quả
- Hai container mariadb và keycloak đã chạy lên với đúng port được cấu hình ở file docker-compose.yml

Kết nối với database
- Dùng các công cụ để kết nối với database với các thông tin về host, port, username và password mà chúng ta cấu hình
- Chúng ta thấy database keycloak đã tạo sẵn ra rất nhiều bảng. Keycloak sẽ dùng những bảng này để lưu trữ dữ liệu để phục vụ quản lý đăng nhập, xác thực và phân quyền

Truy cập key cloak
- Mở trình duyệt và truy cập vào localhost:8080 để truy cập keycloak
- Đăng nhập keycloak bằng user, password mặc định. User: admin, pass: admin

Tạo realm mới
- Vào Manage realm, chọn button Create Realm sẽ hiện popup để tạo Realm
- Nhập Realm name. Chọn Create, để tạo Realm mới

Tạo User mới
- Chọn User, sau đó chọn button create new user
- Nhập Username, First Name và Last Name của user
- Các tùy chọn khác mình sẽ giới thiệu ở một bài viết khác
- Click Create để tạo User mới

Tạo user mới thành công

Xem user mới tạo trong bảng USER_ENTITY trong database

Ở các bài viết sau mình sẽ giới thiệu cách thêm password cho user và lấy token
All rights reserved