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

真正的快乐来源于创造

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
首先定义一个Annotation
package com.heyang.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrivilegeFor{
    
int value() default 0;
}

其次在接口IDocService中使用这个Annotation设定执行方法所需要的权限值:
package com.heyang.service;

import com.heyang.anno.PrivilegeFor;
import com.heyang.domain.Doc;
import com.heyang.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
     
*/

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

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

    @PrivilegeFor(value
=40)
    
public void update(Doc doc,User user);
}

其三,在前置通知权限控制类中通过Annotation反射API得到方法需要的权限值,再根据用户的权限值进行权限判定,不满足则抛出异常,这样权限不足的用户将无法访问DocService的相应方法。
package com.heyang.service;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

import com.heyang.anno.PrivilegeFor;
import com.heyang.domain.User;
import com.heyang.exception.PrivilegeNotEnoughException;

/**
 * 实现权限子系统
 * 
@author: 何杨(heyang78@gmail.com)
 * @date: 2009-1-2-下午04:19:13
 
*/

public class PrivilegeService implements MethodBeforeAdvice{
    
/**
     * 在IDocService的实际方法开始前进行前置处理--权限检查
     
*/

    
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
        
// 取得方法名
        String mothodName=arg0.getName();
        
        
// 取得方法的标注
        PrivilegeFor privilegeFor=arg0.getAnnotation(PrivilegeFor.class);
        
        
if(privilegeFor!=null){
            
// 取得标注的值(即执行方法所需要的权限)
            int value=privilegeFor.value();
            
            
// 取得用户权限
            User user=(User)arg1[1];
            
int userPrivilegeValue=user.getPrivilegePoint();
            
            
// 权限判断
            if(userPrivilegeValue<=value){
                
throw new PrivilegeNotEnoughException("用户权限必须达到"+value+"才能执行"+mothodName+"操作");
            }

        }

    }

}


最后的结果和XML设置的方案是一致的。
示例执行代码如下:
    ApplicationContext ctx = new ClassPathXmlApplicationContext("context.xml");
        
        IDocService docService
=(IDocService)ctx.getBean("docServiceProxy");
        
        Doc doc
=new Doc("论美国次贷危机的产生及影响");
        User user
=new User("中科院经济所研究员郭德纲",50);
        
        
// 用户向系统添加文章
        try{
            docService.add(doc, user);
        }

        
catch(PrivilegeNotEnoughException ex){
            System.out.println(ex.getMessage());
        }

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

        
catch(PrivilegeNotEnoughException ex){
            System.out.println(ex.getMessage());
        }

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

        
catch(PrivilegeNotEnoughException ex){
            System.out.println(ex.getMessage());
        }

    }

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

代码下载
http://www.blogjava.net/Files/heyang/PrivilegeAnnotation20090106155940.rar

http://www.blogjava.net/Files/heyang/PrivilegeAnnotation220090108213912.rar

需要自行载入的包为:
commons-logging-1.0.4.jar,log4j-1.2.14.jar,spring.jar,mysql-connector-java-5.0.6-bin.jar
posted on 2009-01-06 15:59 何杨 阅读(470) 评论(0)  编辑  收藏

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


网站导航: