auth_rule.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. package auth_service
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "gfast/app/model/admin/auth_rule"
  7. "gfast/app/model/admin/role"
  8. "gfast/app/model/admin/user"
  9. "gfast/app/service/cache_service"
  10. "gfast/app/service/casbin_adapter_service"
  11. "gfast/library/utils"
  12. "github.com/gogf/gf/database/gdb"
  13. "github.com/gogf/gf/errors/gerror"
  14. "github.com/gogf/gf/frame/g"
  15. "github.com/gogf/gf/os/gtime"
  16. "github.com/gogf/gf/util/gconv"
  17. "github.com/gogf/gf/util/gvalid"
  18. )
  19. //获取isMenu==1菜单列表
  20. func GetIsMenuList() ([]*auth_rule.Entity, error) {
  21. list, err := GetMenuList()
  22. if err != nil {
  23. return nil, err
  24. }
  25. var gList = make([]*auth_rule.Entity, 0, len(list))
  26. for _, v := range list {
  27. if v.Ismenu == 1 {
  28. gList = append(gList, v)
  29. }
  30. }
  31. return gList, nil
  32. }
  33. //获取isMenu=1且status=1的菜单列表
  34. func GetIsMenuStatusList() ([]*auth_rule.Entity, error) {
  35. list, err := GetMenuList()
  36. if err != nil {
  37. return nil, err
  38. }
  39. var gList = make([]*auth_rule.Entity, 0, len(list))
  40. for _, v := range list {
  41. if v.Ismenu == 1 && v.Status == 1 {
  42. gList = append(gList, v)
  43. }
  44. }
  45. return gList, nil
  46. }
  47. //获取status==1的菜单列表
  48. func GetMenuIsStatusList() ([]*auth_rule.Entity, error) {
  49. list, err := GetMenuList()
  50. if err != nil {
  51. return nil, err
  52. }
  53. var gList = make([]*auth_rule.Entity, 0, len(list))
  54. for _, v := range list {
  55. if v.Status == 1 {
  56. gList = append(gList, v)
  57. }
  58. }
  59. return gList, nil
  60. }
  61. //获取所有菜单
  62. func GetMenuList() (list []*auth_rule.Entity, err error) {
  63. cache := cache_service.New()
  64. //从缓存获取
  65. iList := cache.Get(cache_service.AdminAuthMenu)
  66. if iList != nil {
  67. list = iList.([]*auth_rule.Entity)
  68. return
  69. }
  70. //从数据库获取
  71. list, err = auth_rule.Model.Order("weigh desc,id asc").FindAll()
  72. if err != nil {
  73. return
  74. }
  75. //缓存菜单
  76. cache.Set(cache_service.AdminAuthMenu, list, 0, cache_service.AdminAuthTag)
  77. return
  78. }
  79. //检查菜单规则是否存在
  80. func CheckMenuNameUnique(name string, id int) bool {
  81. model := auth_rule.Model.Where("name=?", name)
  82. if id != 0 {
  83. model = model.And("id!=?", id)
  84. }
  85. c, err := model.Count()
  86. if err != nil {
  87. g.Log().Error(err)
  88. return false
  89. }
  90. return c == 0
  91. }
  92. // 添加菜单操作
  93. func AddMenu(req *auth_rule.MenuReq) (err error, insertId int64) {
  94. menuMap := gconv.Map(req)
  95. now := gtime.Timestamp()
  96. menuMap["createtime"] = now
  97. menuMap["updatetime"] = now
  98. res, e := auth_rule.Model.Insert(menuMap)
  99. err = e
  100. insertId, _ = res.LastInsertId()
  101. return
  102. }
  103. //修改菜单操作
  104. func EditMenu(req *auth_rule.MenuReq, id int) (err error, rows int64) {
  105. menuMap := gconv.Map(req)
  106. now := gtime.Timestamp()
  107. menuMap["updatetime"] = now
  108. res, e := auth_rule.Model.Where("id=?", id).Update(menuMap)
  109. err = e
  110. rows, _ = res.RowsAffected()
  111. return
  112. }
  113. //获取用户组(角色)列表
  114. func GetRoleList() (list []*role.Entity, err error) {
  115. cache := cache_service.New()
  116. //从缓存获取
  117. iList := cache.Get(cache_service.AdminAuthRole)
  118. if iList != nil {
  119. list = iList.([]*role.Entity)
  120. return
  121. }
  122. //从数据库获取
  123. list, err = role.Model.OrderBy("list_order asc,id asc").All()
  124. //缓存数据
  125. cache.Set(cache_service.AdminAuthRole, list, 0, cache_service.AdminAuthTag)
  126. return
  127. }
  128. //保存角色信息并返回插入的id
  129. func AddRole(tx *gdb.TX, data map[string]interface{}) (InsId int64, err error) {
  130. if e := checkRoleData(data); e != nil {
  131. err = gerror.New(e.(*gvalid.Error).FirstString())
  132. return
  133. }
  134. //保存角色信息
  135. now := gtime.Timestamp()
  136. roleMap := gdb.Map{
  137. "parent_id": data["parent_id"],
  138. "status": data["status"],
  139. "name": data["name"],
  140. "create_time": now,
  141. "update_time": now,
  142. "list_order": data["list_order"],
  143. "remark": data["remark"],
  144. }
  145. var res sql.Result
  146. res, err = tx.Table(role.Table).Data(roleMap).Save()
  147. if err != nil {
  148. return
  149. }
  150. InsId, _ = res.LastInsertId()
  151. return
  152. }
  153. //添加角色授权规则
  154. func AddRoleRule(iRule interface{}, roleId int64) (err error) {
  155. enforcer, e := casbin_adapter_service.GetEnforcer()
  156. if e != nil {
  157. err = e
  158. return
  159. }
  160. rule := gconv.Strings(iRule)
  161. for _, v := range rule {
  162. _, err = enforcer.AddPolicy(fmt.Sprintf("g_%d", roleId), fmt.Sprintf("r_%s", v), "All")
  163. if err != nil {
  164. return
  165. }
  166. }
  167. return
  168. }
  169. //修改角色信息操作
  170. func EditRole(tx *gdb.TX, data map[string]interface{}) (err error) {
  171. if _, k := data["id"]; !k {
  172. err = errors.New("缺少更新条件Id")
  173. return
  174. }
  175. if e := checkRoleData(data); e != nil {
  176. err = gerror.New(e.(*gvalid.Error).FirstString())
  177. return
  178. }
  179. //保存角色信息
  180. now := gtime.Timestamp()
  181. roleMap := gdb.Map{
  182. "id": data["id"],
  183. "parent_id": data["parent_id"],
  184. "status": data["status"],
  185. "name": data["name"],
  186. "update_time": now,
  187. "list_order": data["list_order"],
  188. "remark": data["remark"],
  189. }
  190. _, err = tx.Table(role.Table).Data(roleMap).Save()
  191. if err != nil {
  192. return
  193. }
  194. return
  195. }
  196. //修改角色的授权规则
  197. func EditRoleRule(iRule interface{}, roleId int64) (err error) {
  198. enforcer, e := casbin_adapter_service.GetEnforcer()
  199. if e != nil {
  200. err = e
  201. return
  202. }
  203. //查询当前权限
  204. gp := enforcer.GetFilteredPolicy(0, fmt.Sprintf("g_%d", roleId))
  205. //删除旧权限
  206. for _, v := range gp {
  207. _, e = enforcer.RemovePolicy(v)
  208. if e != nil {
  209. err = e
  210. return
  211. }
  212. }
  213. rule := gconv.Strings(iRule)
  214. for _, v := range rule {
  215. _, err = enforcer.AddPolicy(fmt.Sprintf("g_%d", roleId), fmt.Sprintf("r_%s", v), "All")
  216. if err != nil {
  217. return
  218. }
  219. }
  220. return
  221. }
  222. //删除角色权限操作
  223. func DeleteRoleRule(roleId int) (err error) {
  224. enforcer, e := casbin_adapter_service.GetEnforcer()
  225. if e != nil {
  226. err = e
  227. return
  228. }
  229. //查询当前权限
  230. gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", roleId))
  231. //删除旧权限
  232. for _, v := range gp {
  233. _, e = enforcer.RemovePolicy(v)
  234. if e != nil {
  235. err = e
  236. return
  237. }
  238. }
  239. return
  240. }
  241. func checkRoleData(params map[string]interface{}) error {
  242. rules := []string{
  243. "name@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间",
  244. "parent_id@integer|min:0#父级ID必须为整数|父级ID必须大于等于0",
  245. }
  246. e := gvalid.CheckMap(params, rules)
  247. if e != nil {
  248. return e
  249. }
  250. return nil
  251. }
  252. //添加管理员操作
  253. func AddUser(data map[string]interface{}) (InsertId int64, err error) {
  254. e := checkUserData(data, "add")
  255. if e != nil {
  256. err = gerror.New(e.(*gvalid.Error).FirstString())
  257. return
  258. }
  259. if i, _ := user.Model.Where("user_name=?", data["user_name"]).Count(); i != 0 {
  260. err = gerror.New("用户名已经存在")
  261. return
  262. }
  263. if i, _ := user.Model.Where("mobile=?", data["mobile"]).Count(); i != 0 {
  264. err = gerror.New("手机号已经存在")
  265. return
  266. }
  267. //保存管理员信息
  268. data["create_time"] = gtime.Timestamp()
  269. //密码加密
  270. data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey)
  271. res, err := user.Model.Filter().Data(data).Save()
  272. if err != nil {
  273. return
  274. }
  275. InsertId, _ = res.LastInsertId()
  276. return
  277. }
  278. //修改用户信息
  279. func EditUser(data map[string]interface{}) (err error) {
  280. e := checkUserData(data, "edit")
  281. if e != nil {
  282. err = gerror.New(e.(*gvalid.Error).FirstString())
  283. return
  284. }
  285. if i, _ := user.Model.Where("id!=? and user_name=?", data["id"], data["user_name"]).Count(); i != 0 {
  286. err = gerror.New("用户名已经存在")
  287. return
  288. }
  289. if i, _ := user.Model.Where("id!=? and mobile=?", data["mobile"]).Count(); i != 0 {
  290. err = gerror.New("手机号已经存在")
  291. return
  292. }
  293. //保存管理员信息
  294. //提交了密码?密码加密
  295. if val, ok := data["user_password"]; ok && gconv.String(val) != "" {
  296. data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey)
  297. } else {
  298. delete(data, "user_password")
  299. }
  300. _, err = user.Model.Filter().Data(data).Save()
  301. if err != nil {
  302. return
  303. }
  304. return
  305. }
  306. //添加用户角色信息
  307. func AddUserRole(roleIds interface{}, userId int64) (err error) {
  308. enforcer, e := casbin_adapter_service.GetEnforcer()
  309. if e != nil {
  310. err = e
  311. return
  312. }
  313. rule := gconv.Ints(roleIds)
  314. for _, v := range rule {
  315. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", userId), fmt.Sprintf("g_%d", v))
  316. if err != nil {
  317. return
  318. }
  319. }
  320. return
  321. }
  322. //修改用户角色信息
  323. func EditUserRole(roleIds interface{}, userId int) (err error) {
  324. enforcer, e := casbin_adapter_service.GetEnforcer()
  325. if e != nil {
  326. err = e
  327. return
  328. }
  329. rule := gconv.Ints(roleIds)
  330. //删除用户旧角色信息
  331. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", userId))
  332. for _, v := range rule {
  333. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", userId), fmt.Sprintf("g_%d", v))
  334. if err != nil {
  335. return
  336. }
  337. }
  338. return
  339. }
  340. //验证用户表单数据
  341. func checkUserData(params map[string]interface{}, t string) error {
  342. rules := []string{
  343. "id@integer|min:1#管理员id必须为整数|管理员Id必须大于0",
  344. "user_name@required|length:3,60#请填用户名|用户名应在:min到:max个字符之间",
  345. "mobile@telephone#手机号码格式不正确",
  346. "user_nickname@required|length:3,50#请填写姓名|姓名应在:min到:max个字符之间",
  347. "user_email@email#邮箱格式错误",
  348. }
  349. if t == "add" {
  350. rules = append(rules, "user_password@required|length:6,60#请填写密码|密码应在::min到:max个字符之间")
  351. } else {
  352. rules = append(rules, "user_password@length:6,60#密码应在::min到:max个字符之间")
  353. }
  354. e := gvalid.CheckMap(params, rules)
  355. if e != nil {
  356. return e
  357. }
  358. return nil
  359. }
  360. func DeleteRoleByIds(ids []int) (err error) {
  361. //查询所有子级id
  362. roleAllEntity, err := GetRoleList()
  363. if err != nil {
  364. g.Log().Debug(err)
  365. err = gerror.New("删除失败,不存在角色信息")
  366. return
  367. }
  368. roleAll := gconv.SliceMap(roleAllEntity)
  369. sonList := make(g.List, 0, len(roleAll))
  370. for _, id := range ids {
  371. sonList = append(sonList, utils.FindSonByParentId(roleAll, id, "parent_id", "id")...)
  372. }
  373. for _, role := range sonList {
  374. ids = append(ids, gconv.Int(role["id"]))
  375. }
  376. tx, err := g.DB("default").Begin() //开启事务
  377. if err != nil {
  378. g.Log().Error(err)
  379. err = gerror.New("事务处理失败")
  380. return
  381. }
  382. _, err = tx.Table(role.Table).Where("id in(?)", ids).Delete()
  383. if err != nil {
  384. g.Log().Error(err)
  385. tx.Rollback()
  386. err = gerror.New("删除失败")
  387. return
  388. }
  389. //删除角色的权限
  390. for _, v := range ids {
  391. err = DeleteRoleRule(v)
  392. if err != nil {
  393. g.Log().Error(err)
  394. tx.Rollback()
  395. err = gerror.New("删除失败")
  396. return
  397. }
  398. }
  399. tx.Commit()
  400. return
  401. }
  402. //删除菜单
  403. func DeleteMenuByIds(ids []int) (err error) {
  404. //获取菜单数据
  405. menus, err := GetMenuList()
  406. if err != nil {
  407. return
  408. }
  409. menuList := gconv.SliceMap(menus)
  410. son := make(g.List, 0, len(menuList))
  411. for _, id := range ids {
  412. son = append(son, utils.FindSonByParentId(menuList, id, "pid", "id")...)
  413. }
  414. for _, v := range son {
  415. ids = append(ids, gconv.Int(v["id"]))
  416. }
  417. _, err = auth_rule.Model.Where("id in (?)", ids).Delete()
  418. return
  419. }