`
feiyang404
  • 浏览: 56073 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
B7dcf87c-a349-3458-aa59-9c6036b3f5f6
从零开始一步一步做论坛
浏览量:10103
社区版块
存档分类
最新评论

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

阅读更多

      上节谈了版区权限,这次来谈谈个人权限,也就是用户权限.这个系统有一个初始化的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和页面了,还有各种配置.总之,开发一个系统一个人是很不容易的.关键一定要坚持下来.

原创首发,谢谢支持!

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

相关推荐

    空中鼠标控制---抛砖引玉

    在“空中鼠标控制——抛砖引玉”这个项目中,核心是利用双目摄像头来获取用户的手部或任何指定物体的三维空间坐标。双目摄像头,顾名思义,是由两个摄像头组成,通过三角测量原理来计算物体与摄像头之间的距离。它的...

    算法优化抛砖引玉-主要是一些算法的实

    算法优化抛砖引玉-主要是一些算法的实现

    抛砖引玉说监控-运维

    从提供的文件内容中,我们可以梳理出以下几个关于监控和运维的重要知识点: 1. 理想监控系统的五个关键特性: - 完善的管理系统:能够一目了然地展现系统状态,帮助运维人员快速定位问题。 - 强大的配置系统:...

    房地产兵法论专集之二十-抛砖引玉.docx

    【房地产兵法论专集之二十-抛砖引玉】这篇文档虽然以古代战争中的兵法故事开场,但实质上是探讨房地产市场的策略和现象。"抛砖引玉"原指用普通物品吸引更高价值的物品,文中以此比喻房地产市场中高价房产的价值与其...

    通达信指标公式源码 股市冷暖 判断大盘牛熊利器 抛砖引玉熊市主图.doc

    这份"抛砖引玉熊市主图"文档提供的源码,就是一个实例,展示了如何通过计算和分析价格、成交量等数据来评估市场的牛熊状态。 首先,公式中的"SW1"是一个短期和长期移动平均线的综合指标,它是5日指数移动平均线...

    通用应用程序框架(开源)

    小弟不才,斗胆写下几行代码,来这里期待抛砖引玉。 我们身边,每天都有无数的项目开工,然后是老板对进度的紧追不舍,项目经理程序员加班的无奈,再然后或许是成功的喜悦或许是失败的哀愁,但不管结果如何,所有...

    WasSee查看器 - 抛砖引玉版

    这是梦幻西游使用的was文件的查看工具,在编写时看了不少WasTools的代码,终于对was文件有个初步的了解了,在查看挑选图片时比原作者云风的waskey方便一点,但运行时间一长就会冒出个Out of system resource的错误,...

    TinyMind-start-with-0:从零开始深度学习:TinyMind汉字书法识别

    从零开始深度学习:TinyMind汉字书法识别 操作步骤 从官网下载,并解压到当前文件夹。产生train test1 两个文件 运行data.py文件,进行转录,将原始数据集转录为numpy矩阵,生成data.npy及label.npy 运行train.py...

    一个开源通用的应用程序框架 (待参与)

    小弟不才,斗胆写下几行代码,来这里期待抛砖引玉。我们身边,每天都有无数的项目开工,然后是老板对进度的紧追不舍,项目经理程序员加班的无奈,再然后或许是成功的喜悦或许是失败的哀愁,但不管结果如何,所有人...

    CE6.0系统的CAN模块驱动程序-MCP2515、MCP2510都可用

    1.拷贝CANBus文件夹到D:\WINCE600\PLATFORM\SMDK6410\SRC\DRIVERS 目录下 2.在dirs文件中添加CANBus ...注意:驱动中默认波特率为100K,本源码只是个抛砖引玉的作用。可以根据项目实际情况加以修改。

    一个开源通用的应用程序框架2版 (待参与)

    小弟不才,斗胆写下几行代码,来这里期待抛砖引玉。我们身边,每天都有无数的项目开工,然后是老板对进度的紧追不舍,项目经理程序员加班的无奈,再然后或许是成功的喜悦或许是失败的哀愁,但不管结果如何,所有人...

    SAS 语言抛砖引玉.pdf

    #### 六、输出结果 ##### 6.1 输出方式 SAS支持多种输出格式,包括PDF、HTML、RTF等。 ##### 6.2 PRINT过程 用于输出数据集中的数据。 ##### 6.3 PUT输入与输出格式 - **PUT语句**: 用于输出数据。 - **输出格式*...

    微博数据采集python+selenium工程:WBCrawler.zip

    此资源为抛砖引玉,仅为赶时间速成的同学提供完整的项目案例。 ------------------------------------------------------------- 执行项目需要提前安装好python环境(anaconda、pycharm)以及selenium依赖包(pip ...

    CactiForWindows安装手册(抛砖引玉版).pdf

    - 创建用于上传临时文件和会话保存的目录,并设置适当的权限。 3. **配置Apache以支持PHP**: - 在`c:\apache2\conf\httpd.conf`文件中添加以下内容以启用PHP模块和支持: ```ini LoadModule ...

    Delphi-Code-一个挺大的学生管理程序,适合做毕业设计

    拿代码出来,抛砖引玉吧 主要演示了一些查询技巧,里面的综合评测成绩是这样算的 综合评测(一个学期) 课程*课时/总课时*70%+体育*10%+品德 ============================================================== ...

    WPF抛砖引玉系列-微软新一代图形编程

    WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大...

    由简到难!大师教你一步一步设计开关电源

    针对开关电源很多人觉得很难,其实不然。设计一款开关电源并不难,难就难在做精,等你真正入门了,积累一定的经验,再采用分立的结构进行设计就...万事开头难,笔者在这就抛砖引玉,慢慢讲解如何一步一步设计开关电源。

    2010 “中兴捧月”校园程序设计大赛---俄罗斯套娃源码

    本人写的一个关于俄罗斯套娃的源程序,其目的是抛砖引玉,欢迎大家分享优质、高效的代码。 经过本人强力测试,可以处理重量为0的娃娃。其实这也是这个程序比较难的地方。娃娃的重量为0,就表示该路口没有套娃可以...

Global site tag (gtag.js) - Google Analytics