auth_rule.go 8.4 KB

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