auth_rule.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. package auth_service
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "gfast/app/model/auth_rule"
  7. "gfast/app/model/role"
  8. "gfast/app/model/user"
  9. "gfast/app/service/casbin_adapter_service"
  10. "gfast/library/utils"
  11. "github.com/gogf/gf/database/gdb"
  12. "github.com/gogf/gf/errors/gerror"
  13. "github.com/gogf/gf/frame/g"
  14. "github.com/gogf/gf/os/gtime"
  15. "github.com/gogf/gf/util/gconv"
  16. "github.com/gogf/gf/util/gvalid"
  17. )
  18. //菜单对象
  19. type MenuReq struct {
  20. IsMenu int `p:"ismenu" c:"ismenu" v:"min:0|max:1#菜单类型最小值为:min|菜单类型最大值为:max"`
  21. Pid int `p:"pid" c:"pid" v:"min:0"`
  22. Name string `p:"name" c:"name" v:"required#请填写规则名称"`
  23. Title string `p:"title" c:"title" v:"required|length:1,100#请填写标题|标题长度在:min到:max位"`
  24. Icon string `p:"icon" c:"icon"`
  25. Weigh int `p:"weigh" c:"weigh"`
  26. Condition string `p:"condition" c:"condition"`
  27. Remark string `p:"remark" c:"remark"`
  28. Status int `p:"status" c:"status"`
  29. }
  30. //获取菜单列表
  31. func GetMenuList(where string, params ...interface{}) (error, g.List) {
  32. var err error
  33. var list []*auth_rule.Entity
  34. if where != "" {
  35. list, err = auth_rule.Model.Where(where, params...).Order("weigh desc,id asc").FindAll()
  36. } else {
  37. list, err = auth_rule.Model.Order("weigh desc,id asc").FindAll()
  38. }
  39. if err != nil {
  40. g.Log().Error(err)
  41. return err, nil
  42. }
  43. var gList = make(g.List, len(list))
  44. for k, v := range list {
  45. tMap := gconv.Map(v)
  46. gList[k] = tMap
  47. }
  48. return nil, gList
  49. }
  50. // 添加菜单操作
  51. func AddMenu(req *MenuReq) (err error, insertId int64) {
  52. menuMap := gconv.Map(req)
  53. now := gtime.Timestamp()
  54. menuMap["createtime"] = now
  55. menuMap["updatetime"] = now
  56. res, e := auth_rule.Model.Insert(menuMap)
  57. err = e
  58. insertId, _ = res.LastInsertId()
  59. return
  60. }
  61. //修改菜单操作
  62. func EditMenu(req *MenuReq, id int) (err error, rows int64) {
  63. menuMap := gconv.Map(req)
  64. now := gtime.Timestamp()
  65. menuMap["updatetime"] = now
  66. res, e := auth_rule.Model.Where("id=?", id).Update(menuMap)
  67. err = e
  68. rows, _ = res.RowsAffected()
  69. return
  70. }
  71. //获取用户组列表
  72. func GetRoleList(where string, params ...interface{}) (err error, list g.List) {
  73. var rl []*role.Entity
  74. if where != "" {
  75. rl, err = role.Model.Where(where, params).OrderBy("list_order asc,id asc").All()
  76. } else {
  77. rl, err = role.Model.OrderBy("list_order asc,id asc").All()
  78. }
  79. if err != nil {
  80. g.Log().Error(err)
  81. return err, nil
  82. }
  83. list = make(g.List, len(rl))
  84. for k, v := range rl {
  85. tMap := gconv.Map(v)
  86. list[k] = tMap
  87. }
  88. return
  89. }
  90. //保存角色信息并返回插入的id
  91. func AddRole(tx *gdb.TX, data map[string]interface{}) (InsId int64, err error) {
  92. if e := checkRoleData(data); e != nil {
  93. err = gerror.New(e.(*gvalid.Error).FirstString())
  94. return
  95. }
  96. //保存角色信息
  97. now := gtime.Timestamp()
  98. roleMap := gdb.Map{
  99. "parent_id": data["parent_id"],
  100. "status": data["status"],
  101. "name": data["name"],
  102. "create_time": now,
  103. "update_time": now,
  104. "list_order": data["list_order"],
  105. "remark": data["remark"],
  106. }
  107. var res sql.Result
  108. res, err = tx.Table(role.Table).Data(roleMap).Save()
  109. if err != nil {
  110. return
  111. }
  112. InsId, _ = res.LastInsertId()
  113. return
  114. }
  115. //添加角色授权规则
  116. func AddRoleRule(iRule interface{}, roleId int64) (err error) {
  117. enforcer, e := casbin_adapter_service.GetEnforcer()
  118. if e != nil {
  119. err = e
  120. return
  121. }
  122. rule := gconv.Strings(iRule)
  123. for _, v := range rule {
  124. _, err = enforcer.AddPolicy(fmt.Sprintf("g_%d", roleId), fmt.Sprintf("r_%s", v), "All")
  125. if err != nil {
  126. return
  127. }
  128. }
  129. return
  130. }
  131. //修改角色信息操作
  132. func EditRole(tx *gdb.TX, data map[string]interface{}) (err error) {
  133. if _, k := data["id"]; !k {
  134. err = errors.New("缺少更新条件Id")
  135. return
  136. }
  137. if e := checkRoleData(data); e != nil {
  138. err = gerror.New(e.(*gvalid.Error).FirstString())
  139. return
  140. }
  141. //保存角色信息
  142. now := gtime.Timestamp()
  143. roleMap := gdb.Map{
  144. "id": data["id"],
  145. "parent_id": data["parent_id"],
  146. "status": data["status"],
  147. "name": data["name"],
  148. "update_time": now,
  149. "list_order": data["list_order"],
  150. "remark": data["remark"],
  151. }
  152. _, err = tx.Table(role.Table).Data(roleMap).Save()
  153. if err != nil {
  154. return
  155. }
  156. return
  157. }
  158. //修改角色的授权规则
  159. func EditRoleRule(iRule interface{}, roleId int64) (err error) {
  160. enforcer, e := casbin_adapter_service.GetEnforcer()
  161. if e != nil {
  162. err = e
  163. return
  164. }
  165. //查询当前权限
  166. gp := enforcer.GetFilteredPolicy(0, fmt.Sprintf("g_%d", roleId))
  167. //删除旧权限
  168. for _, v := range gp {
  169. _, e = enforcer.RemovePolicy(v)
  170. if e != nil {
  171. err = e
  172. return
  173. }
  174. }
  175. rule := gconv.Strings(iRule)
  176. for _, v := range rule {
  177. _, err = enforcer.AddPolicy(fmt.Sprintf("g_%d", roleId), fmt.Sprintf("r_%s", v), "All")
  178. if err != nil {
  179. return
  180. }
  181. }
  182. return
  183. }
  184. //删除角色权限操作
  185. func DeleteRoleRule(roleId int64) (err error) {
  186. enforcer, e := casbin_adapter_service.GetEnforcer()
  187. if e != nil {
  188. err = e
  189. return
  190. }
  191. //查询当前权限
  192. gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", roleId))
  193. //删除旧权限
  194. for _, v := range gp {
  195. _, e = enforcer.RemovePolicy(v)
  196. if e != nil {
  197. err = e
  198. return
  199. }
  200. }
  201. return
  202. }
  203. func checkRoleData(params map[string]interface{}) error {
  204. rules := []string{
  205. "name@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间",
  206. "parent_id@integer|min:0#父级ID必须为整数|父级ID必须大于等于0",
  207. }
  208. e := gvalid.CheckMap(params, rules)
  209. if e != nil {
  210. return e
  211. }
  212. return nil
  213. }
  214. //添加管理员操作
  215. func AddUser(data map[string]interface{}) (InsertId int64, err error) {
  216. e := checkUserData(data, "add")
  217. if e != nil {
  218. err = gerror.New(e.(*gvalid.Error).FirstString())
  219. return
  220. }
  221. if i, _ := user.Model.Where("user_name=?", data["user_name"]).Count(); i != 0 {
  222. err = gerror.New("用户名已经存在")
  223. return
  224. }
  225. if i, _ := user.Model.Where("mobile=?", data["mobile"]).Count(); i != 0 {
  226. err = gerror.New("手机号已经存在")
  227. return
  228. }
  229. //保存管理员信息
  230. data["create_time"] = gtime.Timestamp()
  231. //密码加密
  232. data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey)
  233. res, err := user.Model.Filter().Data(data).Save()
  234. if err != nil {
  235. return
  236. }
  237. InsertId, _ = res.LastInsertId()
  238. return
  239. }
  240. //修改用户信息
  241. func EditUser(data map[string]interface{}) (err error) {
  242. e := checkUserData(data, "edit")
  243. if e != nil {
  244. err = gerror.New(e.(*gvalid.Error).FirstString())
  245. return
  246. }
  247. if i, _ := user.Model.Where("id!=? and user_name=?", data["id"], data["user_name"]).Count(); i != 0 {
  248. err = gerror.New("用户名已经存在")
  249. return
  250. }
  251. if i, _ := user.Model.Where("id!=? and mobile=?", data["mobile"]).Count(); i != 0 {
  252. err = gerror.New("手机号已经存在")
  253. return
  254. }
  255. //保存管理员信息
  256. //提交了密码?密码加密
  257. if val, ok := data["user_password"]; ok && gconv.String(val) != "" {
  258. data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey)
  259. } else {
  260. delete(data, "user_password")
  261. }
  262. _, err = user.Model.Filter().Data(data).Save()
  263. if err != nil {
  264. return
  265. }
  266. return
  267. }
  268. //添加用户角色信息
  269. func AddUserRole(roleIds interface{}, userId int64) (err error) {
  270. enforcer, e := casbin_adapter_service.GetEnforcer()
  271. if e != nil {
  272. err = e
  273. return
  274. }
  275. rule := gconv.Ints(roleIds)
  276. for _, v := range rule {
  277. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", userId), fmt.Sprintf("g_%d", v))
  278. if err != nil {
  279. return
  280. }
  281. }
  282. return
  283. }
  284. //修改用户角色信息
  285. func EditUserRole(roleIds interface{}, userId int64) (err error) {
  286. enforcer, e := casbin_adapter_service.GetEnforcer()
  287. if e != nil {
  288. err = e
  289. return
  290. }
  291. rule := gconv.Ints(roleIds)
  292. //删除用户旧角色信息
  293. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", userId))
  294. for _, v := range rule {
  295. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", userId), fmt.Sprintf("g_%d", v))
  296. if err != nil {
  297. return
  298. }
  299. }
  300. return
  301. }
  302. //验证用户表单数据
  303. func checkUserData(params map[string]interface{}, t string) error {
  304. rules := []string{
  305. "id@integer|min:1#管理员id必须为整数|管理员Id必须大于0",
  306. "user_name@required|length:3,60#请填用户名|用户名应在:min到:max个字符之间",
  307. "mobile@telephone#手机号码格式不正确",
  308. "user_nickname@required|length:3,50#请填写姓名|姓名应在:min到:max个字符之间",
  309. "user_email@email#邮箱格式错误",
  310. }
  311. if t == "add" {
  312. rules = append(rules, "user_password@required|length:6,60#请填写密码|密码应在::min到:max个字符之间")
  313. } else {
  314. rules = append(rules, "user_password@length:6,60#密码应在::min到:max个字符之间")
  315. }
  316. e := gvalid.CheckMap(params, rules)
  317. if e != nil {
  318. return e
  319. }
  320. return nil
  321. }