论坛首页 Java企业应用论坛

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

浏览 1352 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-11   最后修改:2011-10-11

      上节谈了版区权限,这次来谈谈个人权限,也就是用户权限.这第五和第六节可以说是这个系统的核心了,也是我感觉最难的部分,这两节大概就将系统的权限部分说完了.这个是基于RBAC权限模型实现的,但我个人对其做了一定的修改.希望对大家理解RBAC权限模型有一定参考.这个系统有一个初始化的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{

	@Override
	public 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{

	@Override
	public 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和页面了,还有各种配置.总之,开发一个系统一个人是很不容易的.关键一定要坚持下来.

原创首发,谢谢支持!

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics