身份认证和授权
Added in 0.4.0
jmms的权限模型基于OAuth2的Scope进行实现,设计思路请参考这篇文章Permission scopes | Graph API concepts。
身份认证
访问一个api
的身份有两种类型:
- user: 用户
- client:客户端
一次请求包含的身份信息可以存在四种情况:
- 完全匿名(anonymous)
- 只有用户(user only)
- 只有客户端(client only)
- 用户、客户端两者都有(user & client)
授权定义
jmms把上面的四种身份访问情况和权限(scope)结合起来,组合成下面的三种授权定义:
- 匿名 :既没有用户身份也没有客户端身份
- 用户 + [scope] :用户身份(只要有) + 权限(可选)
- 客户端 + [scope] :客户端身份(有且仅有)+ 权限(可选)
其中匿名
和其他两种方式是互斥的;而用户
和客户端
可以同时定义,两者是或
关系。
Swagger定义
在jmms中,对应上面的身份认证和授权定义,在swagger中有相对应的表达方式。
安全定义
在开启了oauth2
之后,swagger.json
中将会出现两个安全定义:
{
"securityDefinitions": {
"user": {
"type": "oauth2",
"flow": "implicit",
"authorizationUrl": "http://localhost:8088/oauth2/authorize",
"scopes": {}
},
"client": {
"type": "oauth2",
"flow": "application",
"tokenUrl": "http://localhost:8088/oauth2/token",
"scopes": {}
}
}
}
其中user
表示用户类型的安全,client
表示客户端类型的安全;下面分别对三种授权定义进行举例说明。
匿名
匿名表示不需要任何身份认证,也不需要任何权限即可访问,swagger
的定义如下:
{
"paths": {
"/hello": {
"get": {
...
}
}
}
}
在操作定义中不出现
security
。
用户 + 权限
- 用户只需要登录,不需要额外的权限:
{
"paths": {
"/hello": {
"get": {
"security": [
{
"user": []
}
]
}
}
}
}
- 用户需要登录,并且授予额外的权限:
{
"paths": {
"/hello": {
"get": {
"security": [
{
"user": ["read"]
}
]
}
}
}
}
其中
read
为需要的权限
客户端 + 权限
- 客户端只需要经过认证,不需要额外的权限:
{
"paths": {
"/hello": {
"get": {
"security": [
{
"client": []
}
]
}
}
}
}
- 客户端需要经过认证,并且授予额外的权限:
{
"paths": {
"/hello": {
"get": {
"security": [
{
"client": ["admin"]
}
]
}
}
}
}
其中
admin
为需要的权限
上一篇:内置OAuth2 Server
下一篇:操作权限控制