auth_rule.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  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 := iRule.([]interface{})
  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.GetFilteredNamedPolicy("p", 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 := iRule.([]interface{})
  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, "add")
  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 _, ok := data["user_password"]; ok {
  258. data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey)
  259. }
  260. _, err = user.Model.Filter().Data(data).Save()
  261. if err != nil {
  262. return
  263. }
  264. return
  265. }
  266. //添加用户角色信息
  267. func AddUserRole(roleIds interface{}, userId int64) (err error) {
  268. enforcer, e := casbin_adapter_service.GetEnforcer()
  269. if e != nil {
  270. err = e
  271. return
  272. }
  273. rule := roleIds.([]interface{})
  274. for _, v := range rule {
  275. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", userId), fmt.Sprintf("g_%s", v))
  276. if err != nil {
  277. return
  278. }
  279. }
  280. return
  281. }
  282. //修改用户角色信息
  283. func EditUserRole(roleIds interface{}, userId int64) (err error) {
  284. enforcer, e := casbin_adapter_service.GetEnforcer()
  285. if e != nil {
  286. err = e
  287. return
  288. }
  289. rule := roleIds.([]interface{})
  290. //删除用户旧角色信息
  291. enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("u_%d", userId))
  292. for _, v := range rule {
  293. _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", userId), fmt.Sprintf("g_%s", v))
  294. if err != nil {
  295. return
  296. }
  297. }
  298. return
  299. }
  300. //验证用户表单数据
  301. func checkUserData(params map[string]interface{}, t string) error {
  302. rules := []string{
  303. "id@integer|min:1#管理员id必须为整数|管理员Id必须大于0",
  304. "user_name@required|length:3,60#请填用户名|用户名应在:min到:max个字符之间",
  305. "mobile@telephone#手机号码格式不正确",
  306. "user_nickname@required|length:3,50#请填写姓名|姓名应在:min到:max个字符之间",
  307. "user_email@email#邮箱格式错误",
  308. }
  309. if t == "add" {
  310. rules = append(rules, "user_password@required|length:6,60#请填写密码|密码应在::min到:max个字符之间")
  311. } else {
  312. rules = append(rules, "user_password@length:6,60#密码应在::min到:max个字符之间")
  313. }
  314. e := gvalid.CheckMap(params, rules)
  315. if e != nil {
  316. return e
  317. }
  318. return nil
  319. }