通过代理实现权限控制

权限控制在很多系统中都会用到,其实实现权限控制方法有很多,这里给大家介绍一下通过代理模式实现权限控制。Spring中的AOP、Apache的shiro开源项目,其实都是基于此的。

1、实体类Person.java

public class Person {
    private String name;
    private String password;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

2、业务逻辑层接口及实现类
这里的业务逻辑层接口就是代理模式中的抽象对象角色,它的实现类就是真实对象。

import java.util.List;
import java.util.Map;

public interface IPersonService {
    Integer savePerson(Person person);
    void updatePerson(Person person);
    List<Person> findPersonList(Map<String,Object> param);
}
import java.util.List;
import java.util.Map;

public class PersonServiceImpl implements IPersonService{

    @Override
    public Integer savePerson(Person person) {
        return null;
    }

    @Override
    public void updatePerson(Person person) {

    }

    @Override
    public List<Person> findPersonList(Map<String, Object> param) {
        return null;
    }
}

3、创建代理类的工厂

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ServiceProxyFactory implements InvocationHandler {
    private  Object service = null;//真实对象

    public ServiceProxyFactory(){

    }
    public Object createServiceProxy(Object obj){
        this.service = obj;
        return Proxy.newProxyInstance(this.service.getClass().getClassLoader(), 
                this.service.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        PersonServiceImpl personService = (PersonServiceImpl)service;
        if(......){//判断当前登录的用户有没有权限
            return method.invoke(service, args);
        }
        return null;
    }
}

4、使用代理类

public class TestProxy{
    public static void main(String[] args){
        IPersonService service = new PersonServiceImpl();//真实对象
        ServiceProxyFactory proxyFactory = new ServiceProxyFactory();
        IPersonService  proxyService = proxyFactory.createServiceProxy(service);//代理对象
        proxyService.savePerson();//使用代理对象保存Person,当代理对象执行savePerson()方法时,会调用proxyFactory的invoke()方法,因为在创建代理对象时,Proxy.newProxyInstance()方法的第三个参数中传入了一个ServiceProxyFactory的实例。在invoke方法内部就可以进行权限控制,查看当前用户有没有权限进行savePerson()操作。
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值