Keycloak Authz
- 授权服务
- 访问控制方式 / Policy
- ABAC - Attribute-based access control - 基于属性
- RBAC- Role-based access control - 基于角色
- UBAC - User-based access control - 基于用户
- CBAC - Context-based access control - 基于上下文
- Rule-based access control - 基于规则
- 可以使用 JavaScript
- Time-based access control - 基于时间
- 通过策略 SPI (Service Provider Interface) 自定义访问控制机制 (ACMs - access control mechanisms)
abbr | detail | role |
---|---|---|
PAP | Policy Administration Point | Admin UI |
PDP | Policy Decision Point | Authorization Services |
PEP | Policy Enforcement Point | 请求拦截 |
PIP | Policy Information Point | 策略信息 |
RTP | Requesting party token |
- 授权流程
- 资源管理
- 创建资源服务 / Resource Server
- 创建资源 / Resource
- 例如 URL PATH, UUID, ID
- 创建和关联资源域 / Scope
- 一般关联 Action+Resource
- 可以通过资源属性定义
- 权限和策略管理
- 创建策略 / Policy
- 例如 要求匹配 资源和 Scope
- 支持 JavaScript 定义策略
- 定义权限 / Permission
- Resource + Scope + Policy -> grant/deny
- 应用策略到权限
- 创建策略 / Policy
- Policy Enforcement
- 在服务中添加拦截,请求 Keycloak 进行鉴权
- 资源管理
- Authorization Services - 授权服务 - 提供接口给后端进行权限交互
- Token Endpoint
- Token 包含策略信息
- RPT - Requesting Party Token
- Resource Management Endpoint
- 资源管理 - 创建、删除、FindByID、Query
- Permission Management Endpoint
- Issue Permission Tickets
- Token Endpoint
- 资源/Protection API
- 满足 UMA 规范定义的资源标识符
- 需要 uma_protection scope
- 权限/Permission
- 权限决策策略
- Unanimous - 默认 - 所有都允许
- Affirmative - 至少一个允许
- Consensus - 至少一半以上允许
- 权限决策策略
// 拒绝
$evaluation.deny();
// 允许
$evaluation.grant();
public interface Evaluation {
/**
* Returns the {@link ResourcePermission} to be evaluated.
*
* @return the permission to be evaluated
*/
ResourcePermission getPermission();
/**
* Returns the {@link EvaluationContext}. Which provides access to the whole evaluation runtime context.
*
* @return the evaluation context
*/
EvaluationContext getContext();
/**
* Returns a {@link Realm} that can be used by policies to query information.
*
* @return a {@link Realm} instance
*/
Realm getRealm();
/**
* Grants the requested permission to the caller.
*/
void grant();
/**
* Denies the requested permission.
*/
void deny();
}
public interface EvaluationContext {
/**
* Returns the {@link Identity} that represents an entity (person or non-person) to which the permissions must be granted, or not.
*
* @return the identity to which the permissions must be granted, or not
*/
Identity getIdentity();
/**
* Returns all attributes within the current execution and runtime environment.
*
* @return the attributes within the current execution and runtime environment
*/
Attributes getAttributes();
}
Attributes
name | type | desc |
---|---|---|
kc.time.date_time | String | Current date and time - MM/dd/yyyy hh:mm:ss |
kc.client.network.ip_address | String | IPv4 address of the client |
kc.client.network.host | String | Client’s host name |
kc.client.id | String | The client id |
kc.client.user_agent | String[] | The value of the 'User-Agent' HTTP header |
kc.realm.name | String | The name of the realm |
PEP
UMA
http://${host}:${port}/auth/realms/${realm_name}/authz/protection/uma-policy/{resource_id}
Example
Resource | Type | URI | Scopes |
---|---|---|---|
Admin Resources | http://photoz.com/admin | /admin/* | admin:manage |
User Profile Resource | http://photoz.com/profile | /profile | profile:view |
Album Resource | http://photoz.com/album | /album/* | album:delete album:view |
Policies
- Only Owner and Administrators Policy
- type=aggregate AFFIRMATIVE
- Administration Policy,Only Owner Policy
- Administration Policy
- type=aggregate
- Any Admin Policy,Only From a Specific Client Address
- Only Owner Policy
- script-only-owner.js
- Any Admin Policy
- type=role logic=POSITIVE
- roles=admin
- Only From a Specific Client Address
- script-only-keycloak-domain-or-admin.js
- Any User Policy
- type=role logic=POSITIVE
- roles=user,photoz-restful-api/manage-albums
- Admin Resource Permission
- type=resource logic=POSITIVE
- defaultResourceType=http://photoz.com/admin
- default=true
- Album Resource Permission
- type=scope logic=POSITIVE
- scopes=album:view,album:delete
- resources=Album Resource
- View User Permission
- type=scope logic=POSITIVE
- scopes=profile:view
Permission
{
"grant_type": "urn:ietf:params:oauth:grant-type:uma-ticket",
"audience:": "resource_server_client_id",
"permission": ["Resource A#Scope A"],
"ticket": "permission_ticket"
}
{
"access_token": "${rpt}"
}
- Requesting party token
{
"authorization": {
"permissions": [
{
"resource_set_id": "d2fe9843-6462-4bfc-baba-b5787bb6e0e7",
"resource_set_name": "Hello World Resource"
}
]
}
}