日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

如何实现一个权限管理系统?(附源码)

發布時間:2025/3/21 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何实现一个权限管理系统?(附源码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

系統安全一直是在系統開發中不可規避的問題,而權限控制又跟系統安全密不可分,大到用戶的訪問,小到一個頁面的按鈕,都有可能涉及到權限的控制。而renren-security便給我們提供了一套權限系統開發的解決方案。

renren-security是"人人社區"社區開源的輕量級權限管理系統。系統采用SprinBoot、Mybatis、Shiro框架進行開發,極低門檻,拿來即用,支持分布式部署、Quartz分布式集群調度、部門管理、數據權限、云存儲等功能。

項目特點

  • 靈活的權限控制,可控制到頁面或按鈕,滿足絕大部分的權限需求

  • 完善的部門管理及數據權限,通過注解實現數據權限的控制

  • 完善的XSS防范及腳本過濾,徹底杜絕XSS攻擊

  • 支持MySQL、Oracle、SQL Server、PostgreSQL等主流數據庫

運行效果

系統結構的設計也比較清晰,由admin、api、common等幾個模塊組成,每個模塊實現的功能大體如下:

common:公共模塊,以jar包的形式被其他模塊所依賴。實現了一些工具類和公共功能。包含時間處理、分頁、Sql過濾、Xss過濾和Redis切面定義、自定義異常處理等功能。

admin:管理系統模塊,以war包形式獨立部署。基于前后端分離的思想,主要用來用來開發后臺管理系統。包含用戶管理、角色管理、部門管理、菜單管理、定時任務、文件上傳、API校驗,同時采用Redis進行數據緩存,支持單機和集群的部署。

api:API接口模塊,以war包形式獨立部署。模塊主要提供給前端UI調用的一些業務接口,實現了用戶注冊、登錄、接口權限認證和用戶信息獲取。同時整合了swagger2實現了API接口文檔,方便了接口的查詢和調試。

系統架構圖

系統設計之初就特別注重安全性,基于Shiro在頁面和接口都實現了權限校驗。

用戶登錄時對用戶的賬號密碼進行驗證,獲取用戶的信息和role權限,頁面顯示的時候會根據用戶擁有的權限顯示對應的狀態,接口請求的時候也會進行用戶權限的校驗,數據保存到數據庫時候還進行Sql和Xss的過濾,整個過程的核心思路是Shiro對用戶的認證和授權。具體流程如下圖:

權限校驗整體思路

Shiro的認證和授權

實現Shiro的認證和授權,需要自定義Realm繼承于AuthorizingRealm,同時重寫doGetAuthenticationInfo(認證)和doGetAuthorizationInfo(授權)這兩個方法。這里對于系統與Shiro的整合就不再做多的說明。

用戶登錄的時候,將用戶的賬號和密碼包裝成一個UsernamePasswordToken后,再調用login提交賬戶認證,shiro會自動調用我們重寫的doGetAuthenticationInfo方法。

Subject?subject?=?SecurityUtils.getSubject(); UsernamePasswordToken?token?=?new?UsernamePasswordToken(username,?password); //提交認證 subject.login(token); //Shiro進行認證 @Override protected?AuthenticationInfo?doGetAuthenticationInfo(AuthenticationToken?authcToken)?throws?AuthenticationException?{UsernamePasswordToken?token?=?(UsernamePasswordToken)authcToken;//獲取用戶信息SysUserEntity?user?=?new?SysUserEntity();user.setUsername(token.getUsername());user?=?sysUserDao.selectOne(user);//賬號不存在if(user?==?null)?{throw?new?UnknownAccountException("賬號或密碼不正確");}SimpleAuthenticationInfo?info?=?new?SimpleAuthenticationInfo(user,?user.getPassword(),?ByteSource.Util.bytes(user.getSalt()),?getName());return?info; }

如果認證成功,那么在系統的任何地方通過SecurityUtils.getSubject()方法就可以獲取認證通過的信息。我們也可以借助它的這點特性,實現用戶的自動登錄。

這里需要補充一點,系統把權限化成了一個個的標簽保存在數據庫中,用戶的權限中持有對應的標簽則表示擁有對應的操作權限。而對于Shiro的授權,在doGetAuthorizationInfo中需要獲取用戶的所有權限列表,通過權限列表篩選出是否擁有操作權限。

//Shiro進行授權 @Override protected?AuthorizationInfo?doGetAuthorizationInfo(PrincipalCollection?principals)?{//獲取認證時候添加到SimpleAuthenticationInfo中的實例SysUserEntity?user?=?(SysUserEntity)principals.getPrimaryPrincipal();Long?userId?=?user.getUserId();//查詢用戶所有權限Set<String>?permsSet?=?new?HashSet<String>();List<String>?permsList?=?sysUserDao.queryAllPerms(userId);for(String?perms?:?permsList){if(StringUtils.isBlank(perms)){continue;}permsSet.addAll(Arrays.asList(perms.trim().split(",")));}SimpleAuthorizationInfo?info?=?new?SimpleAuthorizationInfo();info.setStringPermissions(permsSet);return?info; }

Shiro的授權是被動的,只有被相應的條件觸發才會進行用戶授權,方式有以下幾種:

1.作用于頁面。頁面里如果遇到<#if shiro.hasPermission("sys:del")>,Shiro會調用自定義Realm獲取權限信息,看"sys:del"是否在權限數據中存在,存在則授權通過,不存在則拒絕訪問,可應用于對一些按鈕和標簽的特定開放。

<#if?shiro.hasPermission("sys:add")><a?class="btn?btn-primary"?@click="add">新增</a> </#if> <#if?shiro.hasPermission("sys:del")><a?class="btn?btn-primary"?@click="del">刪除</a> </#if>

2.通過注解的方式作用于接口。在controller中,方法如果加了@RequiresPermissions("sys:del")注解,Shiro同樣會調用自定義Realm獲取權限信息,看"sys:del"是否在權限數據中存在,存在則授權通過,不存在則拒絕訪問,從而實現對接口的權限校驗。

@RequestMapping("/delete") @RequiresPermissions("sys:del") public?R?delete(long?deptId){//判斷是否有子部門List<Long>?deptList?=?sysDeptService.queryDetpIdList(deptId);if(deptList.size()?>?0){return?R.error("請先刪除子部門");}sysDeptService.deleteById(deptId);return?R.ok(); }

到此,基本上便實現了Shiro在頁面和接口的權限控制。當然,Shiro更多是作用于表現層的一個控制,而出于系統安全考慮也應該增加對數據的校驗。因此在數據層面,則可通過Sql過濾和Xss過濾的方式實現過濾。項目中已經為其封裝成工具,原理都是正則匹配和字符串替換,感興趣的伙伴可以直接到項目里查看,這里就不再累述了。

系統除了實現權限控制外,也實現了很多后臺管理系統開發中常用到的一些功能,像Quartz分布式集群調度、多數據源動態切換以及集群部署下Session管理,感興趣的伙伴也可以查看源碼。

項目地址:https://gitee.com/renrenio/renren-security

總結

以上是生活随笔為你收集整理的如何实现一个权限管理系统?(附源码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。