当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
系统需求

在一个CMS系统中,用户User可以通过接口IDocService向系统添加,删除,更新各种文章Doc,现要求设计IDocService的一个实现类,这个类除了能完成接口指定的功能外,还要能实现权限控制。

具体来说权限控制就是:用户User拥有一个privilegePoint的属性,它代表着用户的权限大小,当此值大于20时用户能添加文章,大于40时能更新文章,大于60时能删除文章。

需要实现的IDocService接口如下:
package com.heyang.traditonal.service;

import com.heyang.traditonal.domain.Doc;
import com.heyang.traditonal.domain.User;

/**
 * DocService需要实现的接口
 * 
@author 何杨(heyang78@gmail.com)
 *
 * 
@since 2008-12-30 下午05:16:17
 * 
@version 1.00
 
*/

public interface IDocService{
    
/**
     * 用户user添加一个文档doc
     * 
@param doc
     * 
@param user
     
*/

    
public void add(Doc doc,User user);
    
    
/**
     * 用户user删除一个文档doc
     * 
@param doc
     * 
@param user
     
*/

    
public void delete(Doc doc,User user);
    
    
/**
     * 用户user更新一个文档doc
     * 
@param doc
     * 
@param user
     
*/

    
public void update(Doc doc,User user);
}


权力限制的基本结构
对于这种简单权限处理当然不难,在执行的方法中取得用户权限再看它是否高于指定的权限即可,大于则执行处理,小于等于则不予执行。程序的基本结构如下:

public void XXAction(Doc doc, User user) {
  
if(user.getPrivilegePoint()>执行XXAction需要的权限值){
    
// 执行处理
  }

  
else{
    
// 权限不够
  }

}


基本方法确定了,接口指定的三个函数也能很快写就。考虑到将需要的权限值硬编码在程序中不方便修改维护,特地使用Spring的IoC,在生成DocService示例时从配置文件中取出值注入进入。下面是最终实现IDocService实现类及其Spring配置文件:

IDocService实现类

package com.heyang.traditonal.service;

import com.heyang.traditonal.domain.Doc;
import com.heyang.traditonal.domain.User;

/**
 * 为领域对象Doc提供服务
 * 
@author 何杨(heyang78@gmail.com)
 *
 * 
@since 2008-12-30 下午05:13:29
 * 
@version 1.00
 
*/

public class DocService implements IDocService{
    
// 添加doc需要的权限点
    private int addDocPrivilegePoint;
    
    
// 删除doc需要的权限点
    private int deleteDocPrivilegePoint;
    
    
// 更新doc需要的权限点
    private int updateDocPrivilegePoint;
    
    
public void add(Doc doc, User user) {
        
if(user.getPrivilegePoint()>addDocPrivilegePoint){
            System.out.println(
""+doc+"交由dao处理(存入数据库)");
        }
        
        
else{
            System.out.println(
"用户权限必须达到"+addDocPrivilegePoint+"才能执行添加操作");
        }

    }


    
public void delete(Doc doc, User user) {
        
if(user.getPrivilegePoint()>deleteDocPrivilegePoint){
            System.out.println(
""+doc+"交由dao处理(从数据库删除)");
        }

        
else{
            System.out.println(
"用户权限必须达到"+deleteDocPrivilegePoint+"才能执行删除操作");
        }

    }


    
public void update(Doc doc, User user) {
        
if(user.getPrivilegePoint()>updateDocPrivilegePoint){
            System.out.println(
""+doc+"交由dao处理(更新数据库中对应的记录)");
        }

        
else{
            System.out.println(
"用户权限必须达到"+updateDocPrivilegePoint+"才能更新添加操作");
        }

    }


    
public int getAddDocPrivilegePoint() {
        
return addDocPrivilegePoint;
    }


    
public void setAddDocPrivilegePoint(int addDocPrivilegePoint) {
        
this.addDocPrivilegePoint = addDocPrivilegePoint;
    }


    
public int getDeleteDocPrivilegePoint() {
        
return deleteDocPrivilegePoint;
    }


    
public void setDeleteDocPrivilegePoint(int deleteDocPrivilegePoint) {
        
this.deleteDocPrivilegePoint = deleteDocPrivilegePoint;
    }


    
public int getUpdateDocPrivilegePoint() {
        
return updateDocPrivilegePoint;
    }


    
public void setUpdateDocPrivilegePoint(int updateDocPrivilegePoint) {
        
this.updateDocPrivilegePoint = updateDocPrivilegePoint;
    }
    
}

配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    
<bean id="docService" class="com.heyang.traditonal.service.DocService">
        
<property name="addDocPrivilegePoint" value="20" />
        
<property name="updateDocPrivilegePoint" value="40" />
        
<property name="deleteDocPrivilegePoint" value="60" />        
    
</bean>
</beans>

业务处理模拟过程,其中用户权限只有50,能添加(>20)和修改文章(>40),不能删除文章(>60):
ApplicationContext ctx = new ClassPathXmlApplicationContext("traditonalCtx.xml");

IDocService docService
=(IDocService)ctx.getBean("docService");

Doc doc
=new Doc("论美国次贷危机的产生及影响");
User user
=new User("中科院经济所研究员",50);

// 用户向系统添加文章
docService.add(doc, user);

// 用户向系统更新文章
doc.setName("论美国次贷危机的产生及影响和我国应该采取的应对措施");
docService.update(doc, user);

// 用户从系统撒删除文章
docService.delete(doc, user);

模拟过程的输出
将文件 名=论美国次贷危机的产生及影响交由dao处理(存入数据库)
将文件 名
=论美国次贷危机的产生及影响和我国应该采取的应对措施交由dao处理(更新数据库中对应的记录)
用户权限必须达到60才能执行删除操作

小结
至此,权限子系统设计完成。在这个子系统中使用接口分离了接口和具体实现,使用Spring的IoC消除了硬编码,最后,使用Spring来调配系统中使用到的各种bean。这三种做法是降低系统耦合度,提高程序可读性和可维护的常见措施,这些常见编程手法在编程中多加使用对整个程序将大有裨益。

例程下载
http://www.blogjava.net/Files/heyang/AOPPrivilegeSample20090102104233.rar

需要自行载入的包为:
commons-logging-1.0.4.jar,log4j-1.2.14.jar,spring.jar
posted on 2009-01-02 10:35 何杨 阅读(458) 评论(1)  编辑  收藏

Feedback

# re: 简单值控制权限系统的设计 2009-08-26 14:09 青秀
没人顶,我顶了。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: