寫在最前
如果這個項目讓你有所收獲,記得 Star 關(guān)注哦,這對我是非常不錯的鼓勵與支持。
源碼地址(后端):https://gitee.com/csps/mingyue-springcloud-learning
源碼地址(前端):https://gitee.com/csps/mingyue-springcloud-ui
文檔地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis
前情回顧
之前我們設(shè)計了權(quán)限模型并提交了數(shù)據(jù)庫腳本,然后通過 mingyue-common-gen
模塊 MingYueCommonGenDemo
生成了基礎(chǔ)代碼,接下來我們需要提供兩個關(guān)鍵接口:
- 獲取用戶權(quán)限信息;
- 獲取用戶路由信息;
TIPS
為了嚴(yán)格按照 RESTful 接口風(fēng)格設(shè)計,變更現(xiàn)有接口命名: getSysUserInfoByUsername => userInfo
、getSysUsers => list
,后續(xù)接口也將嚴(yán)格按照 RESTful 接口風(fēng)格設(shè)計。
登錄緩存用戶信息
Session 會話
Session 是會話中專業(yè)的數(shù)據(jù)緩存組件,通過 Session 我們可以很方便的緩存一些高頻讀寫數(shù)據(jù),提高程序性能,例如:
// 在登錄時緩存 user 對象
StpUtil.getSession().set("user", user);
// 然后我們就可以在任意處使用這個 user 對象
SysUser user = (SysUser) StpUtil.getSession().get("user");
在 Sa-Token 中,Session 分為三種,分別是:
-
Account-Session
: 指的是框架為每個賬號 id 分配的 Session -
Token-Session
: 指的是框架為每個 token 分配的 Session -
Custom-Session
: 指的是以一個特定的值作為 SessionId,來分配的 Session
Token-Session
緩存用戶信息
public static void login(SysUser userInfo) {
// 請求作用域:存儲的數(shù)據(jù)只在一次請求內(nèi)有效,請求結(jié)束后數(shù)據(jù)自動清除。
SaStorage storage = SaHolder.getStorage();
storage.set(LOGIN_USER_KEY, userInfo);
storage.set(USER_KEY, userInfo.getUserId());
// 第1步,先登錄上
StpUtil.login(userInfo.getUserId());
// 第3步,緩存用戶信息
StpUtil.getTokenSession().set(LOGIN_USER_KEY, userInfo);
}
獲取用戶信息
public static SysUser getLoginUser() {
SysUser loginUser = (SysUser) SaHolder.getStorage().get(LOGIN_USER_KEY);
if (loginUser != null) {
return loginUser;
}
loginUser = (SysUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY);
SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
return loginUser;
}
接口測試
@GetMapping("info")
@Operation(summary = "獲取當(dāng)前用戶全部信息")
public R<SysUser> userInfo() {
SysUser sysUser = LoginHelper.getLoginUser();
System.out.println("=============================");
System.out.println(JSONUtil.toJsonStr(sysUser));
System.out.println("=============================");
return R.ok(null);
}
接口調(diào)用打印如下:
=============================
{"userId":1,"username":"mingyue","nickname":"明月","sex":"0","password":"123456","phone":"13288888888","status":"0","isDeleted":"0","createTime":1689757582000,"updateTime":1689757585000,"createBy":"mingyue","updateBy":"mingyue"}
=============================
獲取用戶權(quán)限信息
接口層
@GetMapping("info")
@Operation(summary = "獲取當(dāng)前登錄用戶全部信息")
public R<UserInfoVo> userInfo() {
return R.ok(sysUserService.getUserInfo());
}
業(yè)務(wù)層
@Override
public UserInfoVo getUserInfo() {
UserInfoVo result = new UserInfoVo();
SysUser sysUser = LoginHelper.getLoginUser();
// 密碼置空
sysUser.setPassword(null);
result.setSysUser(sysUser);
// 設(shè)置角色列表
Set<String> rolePermission = sysRoleService.getRolePermission(sysUser.getUserId());
result.setRoles(rolePermission);
// 設(shè)置權(quán)限列表
Set<String> menuPermission = sysMenuService.getMenuPermission(sysUser.getUserId());
result.setRoles(menuPermission);
return result;
}
測試接口
Authorization Token 通過登錄接口獲取
curl -X 'GET' \
'http://mingyue-gateway:9100/system/sysUser/info' \
-H 'accept: */*' \
-H 'Authorization: vXPJnADIcTPfKuP3reBYmmUAi4xjw8nf'
接口返回
{
"code": 200,
"msg": "操作成功",
"data": {
"sysUser": {
"userId": 1,
"username": "mingyue",
"nickname": "明月",
"sex": "0",
"password": null,
"phone": "13288888888",
"email": null,
"avatar": null,
"status": "0",
"isDeleted": "0",
"createTime": "2023-07-19T17:06:22",
"updateTime": "2023-07-19T17:06:25",
"createBy": "mingyue",
"updateBy": "mingyue"
},
"permissions": null,
"roles": [
null,
"system:user:list"
]
}
}
獲取用戶路由信息
接口層
@GetMapping("getRouters")
@Operation(summary = "獲取路由信息")
public R<List<RouterVo>> getRouters() {
Long userId = LoginHelper.getLoginUser().getUserId();
return R.ok(sysMenuService.getRouters(userId));
}
業(yè)務(wù)層
@Override
public List<RouterVo> getRouters(Long userId) {
List<SysMenu> sysMenus = sysMenuMapper.selectMenuTreeByUserId(userId);
return this.recursionMenu(sysMenus, -1L);
}
/**
* 遞歸菜單,構(gòu)建菜單樹
*/
private List<RouterVo> recursionMenu(List<SysMenu> sysMenus, Long pid) {
List<RouterVo> tree = CollUtil.newArrayList();
for (SysMenu menu : sysMenus) {
if (menu.getParentId().equals(pid)) {
RouterVo router = new RouterVo();
router.setPath("/" + menu.getPath());
router.setName(menu.getPath());
router.setComponent(menu.getComponent());
router.setRedirect(menu.getRedirect());
MetaVo metaVo = new MetaVo();
metaVo.setTitle(menu.getMenuName());
metaVo.setIsLink(menu.getIsLink());
metaVo.setIsHide(UserConstants.IS_HIDE.equals(menu.getIsHide()));
metaVo.setIsKeepAlive(UserConstants.IS_KEEP_ALIVE.equals(menu.getIsKeepAlive()));
metaVo.setIsAffix(UserConstants.IS_AFFIX.equals(menu.getIsAffix()));
metaVo.setIsIframe(UserConstants.IS_IFRAME.equals(menu.getIsIframe()));
metaVo.setIcon(menu.getIcon());
router.setMeta(metaVo);
router.setChildren(recursionMenu(sysMenus, menu.getMenuId()));
tree.add(router);
}
}
return tree;
}
測試接口
curl -X 'GET' \
'http://mingyue-gateway:9100/system/sysMenu/getRouters' \
-H 'accept: */*'
-H 'Authorization: vXPJnADIcTPfKuP3reBYmmUAi4xjw8nf'
接口返回文章來源:http://www.zghlxwxcb.cn/news/detail-622133.html
{
"code": 200,
"msg": "操作成功",
"data": [
{
"path": "/system",
"name": "system",
"component": null,
"redirect": null,
"meta": {
"title": "系統(tǒng)管理",
"isLink": "0",
"isHide": false,
"isKeepAlive": false,
"isAffix": false,
"isIframe": false,
"icon": "iconfont icon-xitongshezhi"
},
"children": [
{
"path": "/user",
"name": "user",
"component": "/system/user",
"redirect": null,
"meta": {
"title": "用戶管理",
"isLink": "0",
"isHide": false,
"isKeepAlive": false,
"isAffix": false,
"isIframe": false,
"icon": "iconfont icon-icon-"
},
"children": []
},
...
]
}
]
}
小結(jié)
現(xiàn)在用戶已經(jīng)拿到權(quán)限點了,接下來整合一下權(quán)限點與 Sa-Token 的使用,看看 Sa-Token 如何通過權(quán)限點控制接口訪問。文章來源地址http://www.zghlxwxcb.cn/news/detail-622133.html
到了這里,關(guān)于018-從零搭建微服務(wù)-系統(tǒng)服務(wù)(五)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!