`
哈达f
  • 浏览: 120492 次
  • 性别: 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();
	}
}
 

 

分享到:
评论

相关推荐

    动态代理加注解实现细粒度的权限管理,具体到方法

    总的来说,通过动态代理和注解的结合,我们可以方便地实现细粒度的权限管理,不仅提高了代码的可读性和可维护性,还使得权限控制逻辑与业务逻辑相分离,降低了系统的复杂性。这种方式在大型系统中尤为适用,例如在...

    动态代理加注解实现细粒度的权限管理,具体到方法(前面上传的资源修改)

    此外,`bookstore`可能是一个示例应用,其中包含了使用这种动态代理和注解实现的权限管理机制。这个应用可能包括用户登录、角色分配、权限设置以及带有权限注解的方法等组件。 总之,通过动态代理和注解的结合,...

    使用struts拦截器+注解实现日志审计功能

    拦截器是基于Java的动态代理模式实现的,它们在Action调用前后执行,形成一个拦截器链。每个拦截器都可以执行特定的任务,如验证用户、记录日志等。通过配置Struts配置文件或使用注解,我们可以指定拦截器的执行顺序...

    AOP-CGLIB学习-实现简单的注解权限系统

    总的来说,这个例子展示了如何将Spring的AOP和CGLIB结合,通过注解实现一个简单的权限控制系统。虽然文中提到这个例子可能并不适用于实际生产环境,但它提供了一个理解和学习AOP和CGLIB如何协同工作的基础。在实际...

    反射和注解的妙用-struts2权限的控制

    ### 反射与注解在Struts2中的应用——实现精细权限控制 #### 一、引言 在软件开发过程中,权限控制是一项重要的安全措施,它确保系统的不同部分只能被授权用户访问。对于大型管理系统(MIS)而言,基于方法级别的...

    使用AOP进行权限控制

    为了实现这一目标,开发者通常会在需要权限控制的方法上添加特定的注解,例如`@VersionPermission`。此注解可以携带权限参数,如产品版本(`ProductType`)和体验券类型(`ExperienceType`)。这样,AOP框架能够在...

    Struts2权限控制

    在Struts2中,拦截器是基于Java的动态代理机制实现的。当一个请求到达时,Struts2会按照配置的顺序依次调用拦截器链中的每个拦截器,直到到达Action执行,然后按照相反的顺序返回。拦截器可以用来处理预处理任务(如...

    spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制.docx

    - 使用`AuthorizationAttributeSourceAdvisor`和`DefaultAdvisorAutoProxyCreator`来启用AOP代理,实现基于注解的权限控制。 - 配置`FilterRegistrationBean`和`ServletListenerRegistrationBean`来注册CAS的过滤...

    Springboot+Vue+shiro实现前后端分离、权限控制的示例代码

    【Springboot+Vue+shiro实现前后端分离、权限控制】 在现代Web开发中,前后端分离是一种常见的架构模式,它可以提高开发效率并优化用户体验。Springboot与Vue.js的结合,加上Shiro的安全框架,可以构建出高效、安全...

    Spring+STOMP实现WebSocket广播订阅、权限认证、一对一通讯

    综上所述,结合Spring和STOMP,我们可以构建出强大的WebSocket应用,实现广播订阅、权限控制和一对一通讯功能,满足实时交互的需求。通过`websocket-spring-demo`这个示例项目,你可以深入学习并实践这些概念。

    springboot下自定义注解校验数据权限

    在Spring Boot应用中,数据权限校验是后端开发中的重要环节,确保用户只能访问他们被...在实际应用中,还可以根据项目需求进一步扩展和完善权限验证机制,比如支持更复杂的角色-权限模型,或者实现细粒度的资源控制。

    Spring Boot AOP权限控制模块开发

    在Spring Boot中,我们可以使用注解驱动的AOP,通过定义切面类和切点表达式来实现权限控制。例如,我们可以创建一个名为`AuthorizationAspect`的切面类,其中包含一个或多个通知方法,这些方法会在匹配的切点执行时...

    Java基本的权限设计

    这通常通过动态代理和注解实现。动态代理可以在运行时创建一个代理对象,该对象在调用目标方法之前和之后执行额外的逻辑,比如检查权限。Spring框架提供了一种包装设计模式,使得可以在不修改原有代码的情况下增强...

    Spring整合Shiro做权限控制模块详细案例分析

    Spring 整合 Apache Shiro 是一个常见的权限控制解决方案,它可以帮助开发者轻松地实现用户登录、权限验证、会话管理等功能。在这个案例中,我们将深入探讨如何将 Shiro 与 Spring 结合使用,构建一个完整的权限控制...

    JavaEE spring自动实现AOP代理

    在Day01_AutoAOP的学习资料中,你可能将深入理解Spring AOP的原理,实践自动代理的配置,并通过示例代码体验如何使用AOP进行日志记录、事务管理和权限控制等功能。这将有助于提升你在JavaEE开发中的能力,使你的代码...

    使用SpringAop使用Oracle数据权限控制

    在企业级应用开发中,数据权限控制是必不可少的一部分,它涉及到不同用户或角色对数据库中数据的访问范围。Spring AOP(面向切面编程)是一个强大的工具,常用于实现业务逻辑中的横切关注点,如日志、事务管理以及...

    使用acegi控制用户权限实例

    在Java Web开发中,安全控制是至关重要的一个环节,Acegi Security(现已被Spring Security替代)就是这样一个专门用于实现用户权限控制的框架。本实例将详细介绍如何使用Acegi Security来管理用户权限,确保系统...

    webservice注解修改生成wsdl信息

    - **权限控制**:定义角色和权限,只允许特定用户或角色访问某些服务。 在提供的压缩包中,`ws_server`项目包含了服务端的实现,而`ws_client`项目则为服务的消费者。服务端通常会包含服务接口和其实现,以及可能...

    管理系统系列--SSM企业权限管理系统.zip

    6. **设计模式**: SSM系统可能会使用一些常见的设计模式,如工厂模式(用于创建对象)、单例模式(全局只有一个实例)、代理模式(用于权限控制)等,以提高代码的可读性和可维护性。 7. **数据库设计**: 数据库...

    shiro 注解不起作用

    在你的问题中,“shiro 注解不起作用”可能指的是你在使用Shiro的注解进行权限控制时遇到了问题。Shiro 提供了诸如`@RequiresAuthentication`, `@RequiresPermissions`, `@RequiresRoles`等注解,用于在方法级别进行...

Global site tag (gtag.js) - Google Analytics