auth_rule.go 9.0 KB

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