OA项目之权限设计①(重要据群里面试的人说,今天面试问道如何用代码实现权限设计?)

1.第一步设计实体 用工具画出privilege实体类其中包含的属性和与其他类的关联关系,我们是这么设计的如下图:

OA项目之权限设计①(重要据群里面试的人说,今天面试问道如何用代码实现权限设计?)_第1张图片

我们不是直接让用户和权限关联,而是用了Role这个中间件来关联,原因是如果User跟Privilege直接关联的话比如一个User有80个权限,然后需要增加一些权限那么就要给每个User都增加所以很麻烦,所以就设计一个角色类:admin  游客  会员等等角色,每个角色拥有自己的权限,那么如果需要修改或者增加权限的话只需要给Role增加就ok了,User对应Role,所以设计思路如下:

  User跟角色之间是多对多的关系。

  角色跟Privilege之间也是多对多的关系。

  注意自关联:比如系统管理(Parent)下面又有岗位管理和用户管理,所以是1对多自关联。

OA项目之权限设计①(重要据群里面试的人说,今天面试问道如何用代码实现权限设计?)_第2张图片

权限设计说明:

   权限就是控制功能的使用(功能对应着URL)。

   对功能的控制就是对URL的访问控制。

在我们的程序中,一个功能对应一个或两个URL:

    1,例如列表或删除功能,只对应一个URL.

    2,例如添加或修改功能,对应两个URL:..add, ..addUI


如何来做权限?

         第一步:初始化数据:    ①权限数据                    ②超级管理员(就是new一个用户给他所有权限基本每个系统都有个admin)

         第二步:分配权限:       ①给角色分配权限          ②用户的权限就是用户所有角色的权限。

         第三步:使用权限          ①登录、注销                  ②左侧的菜单是根据权限显示的

                                               ③右侧页面中的链接是根据权限显示的

                                               ④拦截每一个action请求,验证用户是否有权限访问。



写出实体类和对应的hbm文件,代码如下:

Privilege

package com.icss.oa.domain;

import java.util.HashSet;
import java.util.Set;

public class Privilege {
          
	private Long id;
	private String url;
	private String name;
	private Privilege parent;
	private String icon;
	private Set roles=new HashSet();
	private Set children=new HashSet();
	
	
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Privilege getParent() {
		return parent;
	}
	public void setParent(Privilege parent) {
		this.parent = parent;
	}
	public String getIcon() {
		return icon;
	}
	public void setIcon(String icon) {
		this.icon = icon;
	}
	public Set getRoles() {
		return roles;
	}
	public void setRoles(Set roles) {
		this.roles = roles;
	}
	public Set getchildren() {
		return children;
	}
	public void setchildren(Set children) {
		this.children =children;
	}
	
	
}

Privilege.hbm.xml






    

        
           
            
        
        
        
            
        
        
         
            
        
        
        
            
        
        
        
        
        
        
        
          
          
        
        
        
        
          
          
        
        
        
		

    
注意在role类中添加入Privilege属性和hbm文件中的关联关系!


2.第二步就按照上面的步骤进行首先是初始化数据和超级管理员设置就是往数据库插入一些数据,采用跨数据库的方法插入初始化数据


写一个插入数据的类Installer(写这个类之前必须在Privilege类中添加带参数和无参数的构造方法,要使用MD5工具类需要在lib中添加jar包才能用,运行本类看到数据已经插入到数据库中

package com.icss.install;

import javax.annotation.Resource;
import org.apache.commons.codec.digest.DigestUtils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.icss.oa.domain.Privilege;
import com.icss.oa.domain.User;
import com.sun.org.apache.commons.digester.Digester;



@Component
public class Installer {

	@Resource
	private SessionFactory sessionFactory;

	@Transactional
	public void install() {
		Session session = sessionFactory.getCurrentSession();

		// ===================================================
		// 一、超级管理员
		User user = new User();
		user.setName("超级管理员");
		user.setLoginName("admin");
		user.setPassword(DigestUtils.md5Hex("admin")); // 要使用MD5摘要
		session.save(user); // 保存

		// ===================================================
		// 二、权限数据
		Privilege menu, menu1, menu2, menu3, menu4, menu5;

		menu = new Privilege("系统管理", null, "FUNC20082.gif", null);
		menu1 = new Privilege("岗位管理", "roleAction_list", null, menu);
		menu2 = new Privilege("部门管理", "departmentAction_list", null, menu);
		menu3 = new Privilege("用户管理", "userAction_list", null, menu);

		session.save(menu);
		session.save(menu1);
		session.save(menu2);
		session.save(menu3);

		session.save(new Privilege("岗位列表", "roleAction_list", null, menu1));
		session.save(new Privilege("岗位删除", "roleAction_delete", null, menu1));
		session.save(new Privilege("岗位添加", "roleAction_add", null, menu1));
		session.save(new Privilege("岗位修改", "roleAction_edit", null, menu1));

		session.save(new Privilege("部门列表", "departmentAction_list", null, menu2));
		session.save(new Privilege("部门删除", "departmentAction_delete", null, menu2));
		session.save(new Privilege("部门添加", "departmentAction_add", null, menu2));
		session.save(new Privilege("部门修改", "departmentAction_edit", null, menu2));

		session.save(new Privilege("用户列表", "userAction_list", null, menu3));
		session.save(new Privilege("用户删除", "userAction_delete", null, menu3));
		session.save(new Privilege("用户添加", "userAction_add", null, menu3));
		session.save(new Privilege("用户修改", "userAction_edit", null, menu3));
		session.save(new Privilege("用户初始化密码", "userAction_initPassword", null, menu3));

		// -------------------------

		menu = new Privilege("网上交流", null, "FUNC20064.gif", null);
		menu1 = new Privilege("论坛管理", "forumManageAction_list", null, menu);
		menu2 = new Privilege("论坛", "forumAction_list", null, menu);

		session.save(menu);
		session.save(menu1);
		session.save(menu2);

		// -------------------------

		menu = new Privilege("审批流转", null, "FUNC20057.gif", null);
		menu1 = new Privilege("审批流程管理", "processDefinitionAction_list", null, menu);
		menu2 = new Privilege("申请模板管理", "applicationTemplateAction_list", null, menu);
		menu3 = new Privilege("起草申请", "flowAction_applicationTemplateList", null, menu);
		menu4 = new Privilege("待我审批", "flowAction_myTaskList", null, menu);
		menu5 = new Privilege("我的申请查询", "flowAction_myApplicationList", null, menu);

		session.save(menu);
		session.save(menu1);
		session.save(menu2);
		session.save(menu3);
		session.save(menu4);
		session.save(menu5);
	}

	public static void main(String[] args) {
		System.out.println("正在执行安装...");

		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Installer installer = (Installer) ac.getBean("installer");
		installer.install();

		System.out.println("== 安装完毕 ==");
	}
}


分配权限明天再写!





你可能感兴趣的:(OA项目之权限设计①(重要据群里面试的人说,今天面试问道如何用代码实现权限设计?))