安全认证
概念
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
RBAC:Role-BasedAccess Control,基于角色的访问控制。RBAC认为权限授权实际上是Who、What、How的问题。在RBAC模型中,who、what、how构成了访问权限三元组,也就是“Who对What(Which)进行How的操作,也就是“主体”对“客体”的操作,其中 who——是权限的拥有者或主体(如:User、Role) what——是资源或对象(Resource、Class) how——是操作方式(CRUD)
so-fast基础框架遵循RBAC设计理念,基于用户,角色、权限三个核心实体实现系统的访问控制。
系统认证以及权限控制(重点)
基于UPMS设计,so-fast的安全认证被设计为客户端和服务器端同时持有Token令牌,在认证时需要检查Token的合法性以及时效性。
so-fast提供的安全认证主要涉及页面控制、API控制两个大类。通过上诉UPMS模块的设计可以看出,系统的所包含的各个页面、以及API接口均可在UPMS中进行维护,通过创建权限并指定权限范围就可以进行细粒度的页面与API的控制。
so-fast的安全控制被设计为可应对多种情况的配置试模块,主要从以下几个维度进行灵活配置:
- 登录时是否需要验证码(参考系统内置系统管理模块)
- 登录成功是是否同时返回用户信息
- 是否允许同一个账号不同的客户端同时登陆
- 无需认证的系统白名单
- 是否需要细粒度的API权限控制
在配置文件中可以灵活地控制系统安全相关特性,如下所示:
#安全配置
sofast:
security:
jwt:
singkey: so-fast #系统签名。
expiration: 1800 #token有效时间,秒级单位,每次认证成功token均会以此为单位,延长有效时间。
longexpiration: -1 #保留
secretkey: 09152205192rytt103080514ShuCCCCC---henLLLLVVVVdedoo(rtertter)dds #token加密串,安全起见项目自行设置。
whitelist: /** #系统自定义白名单,无需认证的接口可以配置在此处。
need:
userinfo: true #用户登录获取Token的同时,是否同时返回用户信息。
detailsauthority: false #系统是否需要详细的API接口控制,如设置为false,则只要用户持有合法有效的Token令牌即可访问全部API接口,如设置为true,则用户只能访问在UPMS内设定的API接口。
limit:
multiplelogin: true #是否允许同一个账号多终端登录。当设置为true时为允许,设置为false时这每次重复登录都会踢出上一次登录终端。
核心URL一览:
用户登录
- URL:http://localhost:8081/login
请求方式:post
参数:jsonbody
{
"username":"admin", //用户登录名
"password":"000000", //密码
"verificationKey":"1607479069296", //时间戳 当系统配置为需要验证码时,此项需设定
"verificationCode":"lj5g" //验证码 当系统配置为需要验证码时,此项需设定
}
- 返回内容
{
"data": {
"accessToken": "Bearer eyJ0eXAiOiJKV1QiLCJjbGllbnRfZGl2IjoicGMiLCJhbGciOiJIUzI1NiJ9.eyJyb2wiOiJhZG1pbiIsImlzcyI6Im5uY2FyZSIsImF1ZCI6ImFkbWluMyIsImlhdCI6MTYwNzAwMzc4Miwic3ViIjoiYWRtaW4zIiwianRpIjoiNCJ9.1TUPpys_3KL5DirQ2lsT2eOPO8HTwrCqnA_eCz0jsSE",
"userId": 4,
"userInfo": {
"admin": "1",
"avatarUrl": "2020/11/30/b2306caa-ec52-469e-814c-ab19ef4fdc64.jpeg",
"deleteFlg": 0,
"id": 4,
"loginName": "admin3",
"mail": "aaaaaaaaaaaa@aaa.com",
"realName": "爱吃肉",
"status": "0",
"tel": "18888888888",
"updateUser": 4
}
},
"status": 0
}
返回内容是在上述配置文件设置 need.userinfo为true的情况下的结果,当为false时userInfo项不返回
用户退出
- URL:http://localhost:8081/logout
请求方式:get
参数:header
Authorization:Bearer eyJ0eXAiOiJKV1QiLCJjbGllbnRfZGl2IjoicGMiLCJhbGciOiJIUzI1NiJ9.eyJyb2wiOiJhZG1pbiIsImlzcyI6Im5uY2FyZSIsImF1ZCI6ImFkbWluMyIsImlhdCI6MTYwNzAwMzc4Miwic3ViIjoiYWRtaW4zIiwianRpIjoiNCJ9.1TUPpys_3KL5DirQ2lsT2eOPO8HTwrCqnA_eCz0jsSE
- 返回内容
{
"status": 0,
"code": null,
"message": null,
"data": [],
"e": null
}
异常返回
- 如登录时用户名口令错误,请求状态为200,返回结果如下:
{
"code": "Err.E001",
"message": "登陆失败,请确认用户名口令.",
"status": 1
}
- 如验证码错误,请求状态为200,返回结果如下
{
"code": "Err.E010",
"message": "请输入正确的验证码.",
"status": 1
}
{
"code": "Err.E011",
"message": "验证码已过期.",
"status": 1
}
- 如访问白名单以外的API时不携带token,则会返回:401错误,详细内容为:
{
"code": "Err.E003",
"message": "TOKEN非法或已过期.",
"status": 1
}
- 如客户端持有的token过期,则会返回:401错误,详细内容为:
{
"code": "Err.E003",
"message": "TOKEN非法或已过期.",
"status": 1
}
- 如使用非本系统授权的token,则会返回:401错误,详细内容为:
{
"code": "Err.E003",
"message": "TOKEN非法或已过期.",
"status": 1
}
- 如访问受限的API,则会返回:403错误,详细内容为:
{
"code": "Err.E002",
"message": "访问受限,请确认权限.",
"status": 1
}
特别注意
当后台API需要获取当前用户信息的情况下,请务必携带合法有效的Token,否者会出现系统异常。
