读书人

从零开始一步一步干论坛-抛砖引玉,欢迎

发布时间: 2012-07-04 19:33:54 作者: rapoo

从零开始一步一步做论坛------抛砖引玉,欢迎拍砖[六]----权限

? ? ? 上节谈了版区权限,这次来谈谈个人权限,也就是用户权限.这个系统有一个初始化的Action,当执行这个Action的时候,会对系统的[权限--角色--用户组]有一个初始化的功能.代码如下:

?

//添加用户权限类public class SystemInitAction extends ActionSupport{private PermissionService permissionService;private RoleService roleService;private UserGroupService userGroupService;private UserInfoService userInfoService;private UserLevelService userLevelService;public String execute() {ExportDB.CreateDB();/***************************构造角色****************************/// 注册用户角色Role registerRole = new Role();registerRole.setRoleName("普通注册用户");registerRole.setTypeID(0);Set registerSet = new HashSet();registerSet.add(SystemInit.p101);registerSet.add(SystemInit.p102);registerSet.add(SystemInit.p103);registerSet.add(SystemInit.p201);registerSet.add(SystemInit.p202);registerSet.add(SystemInit.p203);registerRole.setPromissions(registerSet);this.getRoleService().saveRole(registerRole);//版主角色Role boardMasterRole = new Role();boardMasterRole.setRoleName("版主角色");boardMasterRole.setTypeID(1);Set boardMasterSet = new HashSet();boardMasterSet.add(SystemInit.p401);boardMasterSet.add(SystemInit.p402);boardMasterSet.add(SystemInit.p403);boardMasterSet.add(SystemInit.p404);boardMasterRole.setPromissions(boardMasterSet);this.getRoleService().saveRole(boardMasterRole);//超级管理员角色Role adminRole = new Role();adminRole.setRoleName("超级管理员");adminRole.setTypeID(1);Set adminSet = new HashSet();adminSet.add(SystemInit.p000);adminSet.add(SystemInit.p101);adminSet.add(SystemInit.p102);adminSet.add(SystemInit.p103);adminSet.add(SystemInit.p201);adminSet.add(SystemInit.p202);adminSet.add(SystemInit.p203);adminSet.add(SystemInit.p401);adminSet.add(SystemInit.p402);adminSet.add(SystemInit.p403);adminSet.add(SystemInit.p404);adminRole.setPromissions(adminSet);this.getRoleService().saveRole(adminRole);/***************************构造用户组****************************///游客用户组UserGroup guestGroup = new UserGroup();guestGroup.setGroupName("游客用户组");guestGroup.setGroupDesc("只有少部分权限");guestGroup.setType(Constant.GROUP_GUEST);Set guestSet = new HashSet();guestSet.add(registerRole);guestGroup.setRoles(guestSet);this.getUserGroupService().saveUserGroup(guestGroup);// 注册用户组UserGroup registerGroup = new UserGroup();registerGroup.setGroupName("注册用户组");registerGroup.setGroupDesc("拥有注册用户所有权限");registerGroup.setType(Constant.GROUP_REGISTER);Set register = new HashSet();register.add(registerRole);registerGroup.setRoles(register);this.getUserGroupService().saveUserGroup(registerGroup);//系统超级管理员UserGroup adminGroup = new UserGroup();adminGroup.setGroupName("超级管理员");adminGroup.setGroupDesc("系统超级管理员,不解释");adminGroup.setType(Constant.GROUP_ADMINISTRATOR);Set superRole = new HashSet();superRole.add(adminRole);adminGroup.setRoles(superRole);this.getUserGroupService().saveUserGroup(adminGroup);//构造系统超级管理员UserInfo admin = new UserInfo();admin.setUserName("admin");admin.setPassword("123456");admin.setUserLevel(this.getUserLevelService().getUserLevelByValue(100000));admin.setUserGroup(adminGroup);admin.setRegTime(1317651595390L);this.getUserInfoService().saveUserInfo(admin);return SUCCESS;}}
?

? ? ? 大家看到这时,请看看以前几个中的图,权限和角色多对多关联,角色和用户组多对多关联,但是用户和用户组之间是多对一关联,一个用户只能属于一个用户组,这就限定死了每个人的权限,或者说限定死了每个用户组对应的权限.当然,用户可以在后台编辑管理这些表之间的对应关系.本来给系统的用户组定义了6种类型,但是在开发中只实现了四种,不过以后可以慢慢完善,主要是系统框架搭好了,完善倒是很容易.当一个用户注册的时候,将这个用户加入注册用户组即可以了.reg方法中只需要一句话,注意UserGroup是有个type的值的,指示不同用户组有不同值,这个值在配置文件中已经写死了.reg方法中加入以下语句:

?

ui.setUserGroup(this.getUserGroupService().getUserGroupByType(Constant.GROUP_REGISTER));

? ? ? ?对于没有注册的用户,他来论坛也必须有一定的权限,所以对于UserLoginInterceptor这个拦截器来说,如果用户登录,就通过,如果没有登录,构造一个虚拟的游客身份,同事给予游客对应的权限,或者说将其和游客用户组绑定,代码如下:

?

public class UserLoginInterceptor  extends AbstractInterceptor{@Overridepublic String intercept(ActionInvocation invocation) throws Exception {ActionContext ac = invocation.getInvocationContext();HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);HttpServletResponse response = (HttpServletResponse) ac.get(ServletActionContext.HTTP_RESPONSE);ServletContext servletContext = (ServletContext) ac.get(ServletActionContext.SERVLET_CONTEXT);WebApplicationContext wc = WebApplicationContextUtils.getWebApplicationContext(servletContext);UserInfoService userInfoService = (UserInfoService) wc.getBean("userInfoService");UserGroupService userGroupService = (UserGroupService) wc.getBean("userGroupService");UserSession us = (UserSession) ac.getSession().get(Constant.USERSESSION);if(us!=null){//登录return invocation.invoke();}else{//游客ac.getSession().put(Constant.USERSESSION, this.createGuestUserSession(userInfoService, userGroupService));return invocation.invoke();}}private UserSession createGuestUserSession(UserInfoService userInfoService, UserGroupService userGroupService){UserSession us = new UserSession();us.setUserName("guest");UserGroup ug = userGroupService.getUserGroupByType(Constant.GROUP_GUEST);us.setGroupID(ug.getId());us.setIsGuest(1);Map[] permissionMap = userInfoService.getUserPermissions(ug);us.setUserPermissionArray(permissionMap);return us;}}

?最后对所有用户进行权限拦截,如果有权限则放行,没有权限拦截.代码如下:

?

public class UserPermissionInterceptor extends AbstractInterceptor{@Overridepublic String intercept(ActionInvocation invocation) throws Exception {ActionContext ac = invocation.getInvocationContext();String actionName = "/"+ac.getName();String saction = "";Map map = ac.getParameters();String[] _saction = (String[]) map.get("action");if(_saction!=null){saction = _saction[0];}boolean havaPermission = false;ServletContext servletContext = (ServletContext)ac.get(ServletActionContext.SERVLET_CONTEXT);WebApplicationContext wc = WebApplicationContextUtils.getWebApplicationContext(servletContext);if(wc==null){return "null";//此处需要修改}else{UserSession us = (UserSession) ac.getSession().get(Constant.USERSESSION);    Map m = us.getUserPermission();    Permission permission = (Permission) us.getUserPermission().get(actionName + "?action=*");if(permission!=null){havaPermission = true;System.out.println("全权通过");}else{permission = (Permission) us.getUserPermission().get(actionName+"?action="+saction);System.out.println("权限拦截器执行:"+actionName+"?action="+saction);if(permission !=null){havaPermission = true;}else{havaPermission = false;}}if(havaPermission){System.out.println("权限拦截器执行:顺利通过");return invocation.invoke();}else{//此处需要添加System.out.println("权限拦截器执行:未通过");return null;}}}}

? ? ? 这个拦截器还不是很全面,有许多地方需要改进.

? ? ? 个人感觉其实开发一个系统,前期搭好框架不是很难,但是后期完善才是最花费时间的.虽然各种Service--Action已经写完了,但是要实现某个小功能,就有可能修改Action中的方法,所以大概实现了框架,那么剩下来的时间就是慢慢的修改Action和页面了,还有各种配置.总之,开发一个系统一个人是很不容易的.关键一定要坚持下来.

原创首发,谢谢支持!

1 楼 pkptzx 2011-10-12 顶下.你要做论坛的话,权限没这么简单... 2 楼 一白水星 2011-10-14 楼主威武!

读书人网 >软件架构设计

热点推荐