`
哈达f
  • 浏览: 114673 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

动态代理+注解实现用户权限控制

    博客分类:
  • j2se
阅读更多

首先第一步我们需要定义一个接口UserDao

 

package cn.dhcool.proxy.auth;

public interface UserDao {

	@Auth("admit")
	public abstract void addUser();

	@Auth("admit")
	public abstract void delUser();

	@Auth("admit")
	public abstract User findUser();

	@Auth("admit,user")
	public abstract void updataUser();

}

 

一个实现类UserDaoImp

 

package cn.dhcool.proxy.auth;

public class UserDaoImp implements UserDao {

	@Auth("admit")
	public void addUser(){
		System.out.println("add");
	}
	
	@Auth("admit")
	public void delUser(){
		System.out.println("delUser");
	}

	@Auth("admit")
	public User findUser(){
		System.out.println("findUser");
		return null;
	}

	@Auth("admit,user")
	public void updataUser(){
		System.out.println("updataUser");
	}

}

 基本用户权限Domain: User

 

package cn.dhcool.proxy.auth;

public class User {

	private String userName;
	private String role;
	
	public User() {

	}

	public User(String userName, String role) {
		this.userName = userName;
		this.role = role;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

}
 

用于获取动态代理类的工具类 : ProxyClass

 

package cn.dhcool.proxy.auth;

import java.lang.reflect.Proxy;

public class ProxyClass {
	//真实对象
	private Object realObject;
	
	private User user;
	
	public ProxyClass(Object realObject,User user) {
		this.realObject = realObject;
		this.user = user;
	}
	
	public Object newProxyInstance(){
		return Proxy.newProxyInstance(this.realObject.getClass().getClassLoader(), 
				this.realObject.getClass().getInterfaces(),new MyInvocationHandler(realObject,user));
	}	

}

 注解的定义:Auth

 

package cn.dhcool.proxy.auth;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auth {
	
	public String value();

}

 

接口回调:MyInvocationHandler

 

package cn.dhcool.proxy.auth;

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

public class MyInvocationHandler implements InvocationHandler{
	
	private Object realObject;
	private User user;
	
	public MyInvocationHandler(Object realObject,User user){
		this.realObject = realObject;
		this.user = user;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		String role = user.getRole();
		//获取代理类调用的方法名
		String methodName = method.getName();
		//反射获取真实类的方法
		Method realMethod = this.realObject.getClass().getMethod(methodName,method.getParameterTypes());
		
		//判断真实的方法是否有注解
		if(realMethod.isAnnotationPresent(Auth.class)){
			Auth auth = realMethod.getAnnotation(Auth.class);
			String[] auths = auth.value().split(",");
			//循环遍历该方法能访问的角色是否包含该用户的角色
			for (int i = 0; i < auths.length; i++) {
				if(auths[i].equals(role)){
					return realMethod.invoke(realObject, args);
				}
			}
			throw new RuntimeException("你没有这个权限");
		}
		return null;
	}

}
 

 

客户端调用:

 

package cn.dhcool.proxy.auth;

public class Client {
	
	public static void main(String[] args) {
		//创建真实对象
		UserDao userDao = new UserDaoImp();
	    //创建用户
		User user = new User("lhc","user");
		
		ProxyClass proxyClass = new ProxyClass(userDao, user);
		
		UserDao userDaoProxy = (UserDao)proxyClass.newProxyInstance();
		userDaoProxy.updataUser();
	}
}
 

 

分享到:
评论

相关推荐

    lamp-cloud微服务脚手架

    通过注解实现用户身份注入 14、在线API 由于原生swagger-ui某些功能支持不够友好,故采用了国内开源的swagger-bootstrap-ui,并制作了stater,方便springboot用户使用。 15、代码生成器 基于Mybatis-plus-generator...

    ABP开发指南

    5.1.2 使用动态js代理 95 5.2 ABP展现层—本地化 97 5.2.1 程序语言 97 5.2.2 本地化源文件 98 5.2.3 获得一个本地化配置文件 100 5.2.4 总结 103 5.3 ABP展现层—Javascript函数库 103 5.3.1 AJAX 103 5.3.2 通知 ...

    java开源包4

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包3

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    lamp-cloud微服务脚手架-其他

    通过注解实现用户身份注入 14、在线API 由于原生swagger-ui某些功能支持不够友好,故采用了国内开源的swagger-bootstrap-ui,并制作了stater,方便springboot用户使用。 15、代码生成器 基于Mybatis-plus-generator...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java开源包1

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包11

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包2

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包6

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包5

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包10

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包8

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包7

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包9

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包101

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

Global site tag (gtag.js) - Google Analytics