新增AuthorityModule

新增net.wendal.nutzbook.module.AuthorityModule类(代码节选),整个类有300+行

  1. @At("/admin/authority")
  2. @IocBean
  3. @Ok("void")//避免误写导致敏感信息泄露到服务器外
  4. public class AuthorityModule extends BaseModule {
  5. /**
  6. * 更新用户所属角色/特许权限
  7. */
  8. @POST
  9. @AdaptBy(type=JsonAdaptor.class)
  10. @RequiresPermissions("authority:user:update")
  11. @At("/user/update")
  12. @Aop(TransAop.READ_COMMITTED)
  13. public void updateUser(@Param("user")User user,
  14. @Param("roles")List<Long> roles,
  15. @Param("permissions")List<Long> permissions) {
  16. // 防御一下
  17. if (user == null)
  18. return;
  19. user = dao.fetch(User.class, user.getId());
  20. // 就在那么一瞬间,那个用户已经被其他用户删掉了呢
  21. if (user == null)
  22. return;
  23. if (roles != null) {
  24. List<Role> rs = new ArrayList<Role>(roles.size());
  25. for (long roleId : roles) {
  26. Role r = dao.fetch(Role.class, roleId);
  27. if (r != null) {
  28. rs.add(r);
  29. }
  30. }
  31. dao.fetchLinks(user, "roles");
  32. if (user.getRoles().size() > 0) {
  33. dao.clearLinks(user, "roles");
  34. }
  35. user.setRoles(rs);
  36. dao.insertRelation(user, "roles");
  37. }
  38. if (permissions != null) {
  39. List<Permission> ps = new ArrayList<Permission>();
  40. for (long permissionId : permissions) {
  41. Permission p = dao.fetch(Permission.class, permissionId);
  42. if (p != null)
  43. ps.add(p);
  44. }
  45. dao.fetchLinks(user, "permissions");
  46. if (user.getPermissions().size() > 0) {
  47. dao.clearLinks(user, "permissions");
  48. }
  49. user.setPermissions(ps);
  50. dao.insertRelation(user, "permissions");
  51. }
  52. }
  53. }

关注点

  • 观察@At入口方法总是带有@RequiresPermissions(…)这种Shiro注解
  • @Aop(TransAop.READ_COMMITTED) 事务安全
  • dao.xxxxxRelation 多对多映射管理
  • @AdaptBy(type=JsonAdaptor.class) 以json接受数据,解决表单传值容易出现串值的问题