A base auth go web project combined with casbin open-source authorization library.
项目代码中支持两种用户状态鉴权机制,分别是beego内置的session机制和目前比较流行的token机制.配置文件中如果设置sessionon
为开启,则系统默认会使用cookie-session机制,
否则使用token模式, token模式一方面可以避免用户禁用token的情景, 另一方面也可以避免集群环境下session失效的情况. 项目中不论是session还是token模式均采取了reids
作为存储引擎, 因此在session模式下,即使重启了服务器只要cookie中携带的sessionID还未失效,则session信息依然可以获取到,无需重新登录.
- 修改conf/app.conf中数据库连接信息
- 配置conf/app.conf中是否开启session
- 安装并启动redis,如果redis为远程服务,则需要根据实际情况修改连接redis配置
- 在项目根目录下新建logs文件夹,里面存放一些日志文件,github上忽略上传需要自己来建
日期 | 版本号 | 作者 | 备注 |
---|---|---|---|
2019.3.31 | 1.0 | Qiangjiyi | 基于casbin的auth模块1.0版本 |
本文档的接口遵循RESTful设计风格
状态码 | 说明 |
---|---|
100000 | 参数不合法 |
100001 | 缺少参数 |
100002 | 数据库操作失败 |
100003 | 解析请求体失败 |
100004 | 序列化数据失败 |
100005 | 反序列化(解析)数据失败 |
100006 | 获取服务的上下文失败 |
100007 | 没有权限 |
100008 | 服务内部错误 |
100009 | shell脚本运行失败 |
基于session
或者token
的机制来实现用户登录
注意事项:如果用户在app.conf中开启了sessionOn = true,则使用session机制,否则使用token。
http://localhost:8080/v1/api/auth/user/login
POST
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 必选 | 说明 | 类型 |
---|---|---|---|
username | 是 | 用户名 | string |
password | 是 | 密码 | string |
请求示例:
{
"username": "admin",
"password": "123456"
}
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
payload | object | 响应体 |
.user_id | number | 用户ID |
.token | string | 登录令牌 |
响应示例:
{
"err_code": 0,
"err_message": "OK",
"payload": {
"user_id": 1,
"token": "gx7KDTNEA26lFcLGHaP0o645aLhe49gP"
}
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100103 | 用户名不正确 |
100104 | 密码不正确 |
根据请求参数注册一个新用户,用户名不能重复
http://localhost:8080/v1/api/auth/user/register
POST
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 必选 | 说明 | 类型 |
---|---|---|---|
username | 是 | 用户名 | string |
password | 是 | 密码 | string |
real_name | 否 | 真实姓名 | string |
mobile | 是 | 手机号 | string |
否 | 邮箱 | string |
请求示例:
{
"username": "qiangjiyi",
"password": "123456",
"real_name": "真实姓名",
"mobile": "18611876729",
"email": "qiangjiyi@163.com"
}
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
payload | object | 响应体 |
.user_id | number | 用户ID |
.username | string | 用户名 |
.create_time | string | 注册时间 |
响应示例:
{
"err_code": 0,
"err_message": "OK",
"payload": {
"user_id": 1,
"username": "qiangjiyi",
"create_time": "2019-01-31 16:43:23"
}
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100102 | 用户名已经被占用 |
移除当前登录用户会话信息
http://localhost:8080/v1/api/auth/user/logout
GET
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
响应示例:
{
"err_code": 0,
"err_message": "OK"
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100106 | 注销登录失败 |
根据请求参数更新用户资料
http://localhost:8080/v1/api/auth/user/update
POST
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 必选 | 说明 | 类型 |
---|---|---|---|
id | 是 | 用户ID | number |
username | 是 | 用户名 | string |
password | 是 | 密码 | string |
real_name | 否 | 真实姓名 | string |
mobile | 是 | 手机号 | string |
否 | 邮箱 | string |
请求示例:
{
"id": 1,
"username": "qiangjiyi1",
"password": "123456789",
"real_name": "真实姓名xxx",
"mobile": "18611876729",
"email": "1473430734@qq.com"
}
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
payload | object | 响应体 |
.user_id | number | 用户ID |
.username | string | 用户名 |
.update_time | string | 更新时间 |
响应示例:
{
"err_code": 0,
"err_message": "OK",
"payload": {
"user_id": 1,
"username": "qiangjiyi1",
"update_time": "2019-01-31 17:00:37"
}
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100100 | 用户ID不合法 |
100101 | 用户ID对应的用户不存在 |
根据请求参数删除对应的用户
http://localhost:8080/v1/api/auth/user/delete/1
GET
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
响应示例:
{
"err_code": 0,
"err_message": "OK"
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100100 | 用户ID不合法 |
100101 | 用户ID对应的用户不存在 |
根据请求参数新建一个角色
http://localhost:8080/v1/api/auth/role/create
POST
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 必选 | 说明 | 类型 |
---|---|---|---|
role_name | 是 | 角色名称 | string |
description | 是 | 角色描述 | string |
请求示例:
{
"role_name": "admin",
"description": "管理员"
}
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
payload | object | 响应体 |
.id | number | 角色ID |
.role_name | string | 角色名称 |
.description | string | 角色描述 |
.create_time | string | 创建时间 |
响应示例:
{
"err_code": 0,
"err_message": "OK",
"payload": {
"id": 15,
"role_name": "admin",
"description": "管理员",
"create_time": "2019-01-31 17:12:29"
}
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
根据请求参数更新指定的角色信息
http://localhost:8080/v1/api/auth/role/update
POST
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 必选 | 说明 | 类型 |
---|---|---|---|
id | 是 | 角色ID | number |
role_name | 是 | 角色名称 | string |
description | 是 | 角色描述 | string |
请求示例:
{
"id": 1,
"role_name": "system_admin",
"description": "系统管理员"
}
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
payload | object | 响应体 |
.id | number | 角色ID |
.role_name | string | 角色名称 |
.description | string | 角色描述 |
.update_time | string | 更新时间 |
响应示例:
{
"err_code": 0,
"err_message": "OK",
"payload": {
"id": 1,
"role_name": "system_admin",
"description": "系统管理员",
"update_time": "2019-01-31 17:18:01"
}
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100200 | 角色ID不合法 |
100201 | 角色ID对应的角色不存在 |
根据请求参数删除指定的角色信息
http://localhost:8080/v1/api/auth/role/delete/1
GET
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
响应示例:
{
"err_code": 0,
"err_message": "OK"
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100200 | 角色ID不合法 |
100201 | 角色ID对应的角色不存在 |
根据请求参数添加权限信息
http://localhost:8080/v1/api/auth/permission/add
POST
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 必选 | 说明 | 类型 |
---|---|---|---|
type | 是 | 权限类型 ['p' 或 'g'] | string |
sub | 是 | 权限主体值 | string |
sub_type | 是 | 权限主体 ['u' 或 'r'] | string |
obj | 是 | 权限资源值 | string |
action | 否 | 请求方式 | string |
说明:如果type为g,则说明添加的是权限组,那么sub_type如果为u,则sub为用户名,否则sub_type为r,则sub为角色ID,而obj此时必须为角色ID;如果type为p,则说明添加的是普通的权限,sub_type和sub的值跟type为g时要求类似,只是obj此时就是我们要访问的restful api地址,action为我们要访问该api地址的请求方式。
请求示例:
{
"type": "g",
"sub": "qiangjiyi",
"sub_type": "u",
"obj": "1",
"action": "GET"
}
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
payload | object | 响应体 |
.policy | string | casbin格式的权限策略 |
响应示例:
{
"err_code": 0,
"err_message": "OK",
"payload": {
"policy": "g, 2, role_1"
}
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100300 | 权限执行模块加载失败 |
100301 | 权限类型不合法 ['p' 或 'g'] |
100302 | 权限主体类型不合法 ['u' 或 'r'] |
100303 | 权限主体值不合法(不存在对应的主体) |
100304 | 权限资源值不合法(不存在对应的角色) |
100305 | 权限已存在 |
根据请求参数查询指定用户的所有角色和权限信息
http://localhost:8080/v1/api/auth/permission/query/1
GET
参数名 | 必选 | 说明 | 默认值 |
---|---|---|---|
Content-Type | 是 | 接受的Content-Type类型 | application/json;charset=UTF-8 |
token | 是 | 登录令牌 | 空 |
说明:如果是token模式的话,请求Headers中必须包含token参数键值对,否则需要开启cookie。
参数名 | 类型 | 描述 |
---|---|---|
err_code | number | 响应码 |
err_message | string | 响应描述 |
payload | object | 响应体 |
.user_id | number | 用户ID |
.username | string | 用户名 |
.real_name | string | 真实姓名 |
.mobile | string | 手机号 |
string | 电子邮箱 | |
.role_list | array list | 角色列表 |
..id | number | 角色ID |
..role_name | string | 角色名称 |
..description | string | 角色描述 |
..update_time | string | 角色最近更新时间 |
.permission_list | []string | 权限列表 |
响应示例:
{
"err_code": 0,
"err_message": "OK",
"payload": {
"user_id": 2,
"username": "qiangjiyi",
"real_name": "强吉义",
"mobile": "18611876729",
"email": "qiangjiyi@163.com",
"role_list": [
{
"id": 5,
"role_name": "组织管理员",
"description": "作为一个组织内部的管理员",
"update_time": "2019-01-21 20:18:55"
},
{
"id": 2,
"role_name": "角色name",
"description": "角色description",
"update_time": "2019-01-23 16:24:48"
},
{
"id": 3,
"role_name": "新角色name",
"description": "新角色description",
"update_time": "2019-01-29 11:11:48"
}
],
"permission_list": [
"2,/v1/api/auth/permission/add,POST",
"2,/v1/api/auth/role/delete/*,GET",
"2,/v1/api/auth/role/delete/:roleId,GET",
"role_3,/v2/api/auth/permission/query,GET"
]
}
}
状态码 | 说明 |
---|---|
0 | 请求成功 |
100100 | 用户ID不合法 |
100101 | 用户ID对应的用户不存在 |
通过以上的接口文档,相信有过go web开发经验的朋友们应该可以将该项目run起来,该部分代码是我之前做的一个比较通用的用户角色权限模块,最近才决定抽取并开源出来,不足之处也希望大家能够指正.
如果在使用过程中遇到问题,可以单独与我交流.