`
芝加哥09
  • 浏览: 60707 次
社区版块
存档分类
最新评论

利用注解模拟权限管理

    博客分类:
  • Java
 
阅读更多

注解是JDK1.5的新特性,而且注解的生命周期可以有处于源程序阶段、字节码阶段和运行时阶段。标识的位置可以处于包级别、类级别、方法级别、属性级别和参数级别。本文主要利用注解的这些特性,模拟权限的管理。

 

定义一个权限组的注解类,同时该注解类的生命周期处于运行时阶段和处于类级别上。

Group.java

package com.cloud.annotation;

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.TYPE)
public @interface Group {
	String group();
}

 

定义一个权限注解类,生命周期为运行时阶段和处于方法级别上。

Privilege.java

 

package com.cloud.annotation;

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 Privilege {
	String privilege();
}

 

模拟两个action层中的类,同时将相应注解打在相应的位置上:

UserAction.java

 

package com.cloud.annotation;

@Group(group="user")
public class UserAction {
	
	@Privilege(privilege="find")
	public String find() {
		return "Find user information.";
	}
	
	@Privilege(privilege="add")
	public String add() {
		return "Add user information.";
	}
	
	@Privilege(privilege="delete")
	public String delete() {
		return "Delete user information.";
	}
	
	@Privilege(privilege="update")
	public String update() {
		return "Update user information.";
	}
}

 

DimensionAction.java

 

package com.cloud.annotation;

@Group(group="dimension")
public class DimensionAction {

	@Privilege(privilege="find")
	public String find() {
		return "Find dimension information.";
	}
	
	@Privilege(privilege="add")
	public String add() {
		return "Add dimension information.";
	}
	
	@Privilege(privilege="delete")
	public String delete() {
		return "Delete dimension information.";
	}
	
	@Privilege(privilege="update")
	public String update() {
		return "Update dimension information.";
	}
}

 

定义一个用户类:

Person.java

 

package com.cloud.annotation;

public class Person {
	private String name;
	private int age;
	private String gender;
	private String[] groups;
	private String[] privileges;

	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public String getGender() {
		return gender;
	}
	
	public void setGender(String gender) {
		this.gender = gender;
	}

	public String[] getGroups() {
		return groups;
	}

	public void setGroups(String[] groups) {
		this.groups = groups;
	}

	public String[] getPrivileges() {
		return privileges;
	}

	public void setPrivileges(String[] privileges) {
		this.privileges = privileges;
	}

	public Person() {}
	
	public Person(String name, int age, String gender, String[] groups, String[] privileges) {
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.groups = groups;
		this.privileges = privileges;
	}
}

 

定义一个测试类:

AnnotationTest.java

 

package com.cloud.annotation;

import java.lang.reflect.Method;

public class AnnotationTest {
	
	public static void main(String[] args) throws Exception {
		String[] groups = {"user"};
		String[] privileges = {"find", "add", "update"};
		//首先创建了一个Person对象,并且他具有对user这个表的查看、增加和更新权限
		Person person = new Person("Chris", 22, "man", groups, privileges);
		
		//分别测试了两种情况,其实就是用于模拟用户的操作
		checkGroupAndPrivilege(person, "com.cloud.annotation.DimensionAction", "update");
		checkGroupAndPrivilege(person, "com.cloud.annotation.UserAction", "find");
	}
	
	/**
	 * 该方法的作用就是用于模拟用于调查用方法的过程。
	 * @param person
	 * @param className
	 * @param methodName
	 * @throws Exception
	 */
	public static void checkGroupAndPrivilege(Person person, String className, String methodName) throws Exception {
		//将要调用的类反射出来
		Class<?> clazz = Class.forName(className);
		//取得被调用类的权限组的注解对象
		Group group = clazz.getAnnotation(Group.class);
		//取得用户具有的权限组
		String[] groups = person.getGroups();
		//取得被调用类的权限组的名字
		String classGroup = group.group();
		
		//检查该用户是否在该权限组内
		if (contain(groups, classGroup)) {
			//反射出要调用的方法
			Method method = clazz.getMethod(methodName);
			//取得该被调用的方法的注解对象
			Privilege privilege = method.getAnnotation(Privilege.class);
			//取得用户具有的权限
			String[] privileges = person.getPrivileges();
			//取得调用该方法应具有的权限
			String methodPrivilege = privilege.privilege();
			
			//检查用户是否具有调用该方法的权限
			if (contain(privileges, methodPrivilege)) {
				System.out.println("Call method success!");
			} else {
				System.out.println("Soryy, you don't have privilege!");
			}
		} else {
			System.out.println("Sorry, you are not in this group!");
		}
	} 
	
	public static boolean contain(String[] strs, String str) {
		boolean b = false;
		for (String val : strs) {
			if (str.equals(val)) {
				b = true;
				break;
			}
		}
		return b;
	}
}

 

测试结果:

Sorry, you are not in this group!
Call method success!

 

分享到:
评论

相关推荐

    模拟手机QQ自动登录.zip

    6. **授权与令牌**:成功登录后,服务器会返回一个授权令牌,用于后续的API调用。需要妥善保存这个令牌,并在后续请求中携带,以证明用户的身份。 7. **异常处理**:考虑到网络问题、账号密码错误、验证码失败等...

    spring security,mybatis,spring mvc 整合权限管理系统

    在IT领域,构建一个权限管理系统是企业级应用的常见需求,它用于确保用户只能访问他们被授权的资源。本项目整合了Spring Security、MyBatis和Spring MVC这三大核心技术,来实现这一目标。以下是关于这些技术及其整合...

    shiro权限管理+SSM登陆+spring定时器+基本博客管理

    然后,利用Shiro进行用户认证和授权,实现了登录和权限控制。接着,通过Spring的定时器设定定时任务,比如定期清理无用的草稿或者过期的评论。最后,前端页面使用富文本编辑器,提供友好的用户界面,允许用户创建和...

    spring_myibaties简单的权限的管理

    10. **测试与部署**:为了确保权限管理功能的完整性和正确性,我们需要编写单元测试和集成测试,模拟各种用户行为和异常情况。部署时,要确保所有配置文件正确无误,包括数据库连接、安全框架配置等。 通过以上步骤...

    C语言实现Linux文件系统模拟文档(内有程序)

    1. **采用高级语言**:利用C语言编写程序模拟文件系统。 2. **多级目录结构**:实现对文件和目录的创建、删除、重命名、变更权限、显示文件内容、修改文件内容等操作。 3. **实验报告内容**:包括实验目的、实验内容...

    文件管理系统+模拟vc的程序

    在模拟VC的环境中,我们可以利用MFC(Microsoft Foundation Classes)库来创建图形用户界面(GUI)。这包括菜单栏、工具栏、状态栏以及对话框等元素,使得用户能够直观地进行文件的创建、打开、保存、关闭、复制、...

    springboot和shiro完成权限管理

    本篇将深入探讨如何利用Spring Boot和Shiro来搭建一套完整的权限管理系统。 首先,Spring Boot是基于Spring框架的快速开发工具,它简化了配置,提供了自动配置特性,使得开发者可以快速构建可独立运行的Java应用。...

    模拟电信系统 ssh 结合

    总之,SSH框架在电信系统模拟中发挥着重要作用,通过合理利用这三个组件,开发者可以构建出高效、可扩展的Java Web应用。对于初学者来说,理解并掌握SSH的整合方式,将是提升自身技能的重要一步。

    SpringMVC权限项目

    综上所述,"SpringMVC权限项目"是一个涵盖多个技术层面的综合性任务,涉及到身份验证、授权、角色权限分配、会话管理、异常处理等多个关键环节,旨在构建一个安全、可控的Web应用环境。通过熟练掌握这些知识点,...

    axure后台管理系统原型rp.rar

    总结来说,“axure后台管理系统原型rp.rar”项目展示了如何使用Axure进行后台管理系统的设计,涵盖了登录权限、数据管理、用户管理等多个关键环节。通过深入学习和实践,我们可以掌握创建高效后台管理系统原型的技能...

    基于springboot+sureness的面向REST API资源无状态认证权限管理系统

    本文将深入探讨如何利用Spring Boot和Sureness框架构建一个面向REST API资源的无状态认证权限管理系统。 Spring Boot是Spring框架的一个微服务开发工具,它简化了Spring应用程序的初始设置和配置,使得开发者可以...

    毕业设计-设计J2SE模拟MVC的企业人事管理系统源码.zip

    《基于J2SE模拟MVC模式的企业人事管理系统》 在当今信息技术飞速发展的时代,企业对信息化管理的需求日益增强。本文将深入探讨一个基于Java Standard Edition(J2SE)平台,采用Model-View-Controller(MVC)设计...

    Spring Boot整合Shiro搭建权限管理系统

    本文将深入探讨如何利用Spring Boot与Shiro的整合来构建一个高效且易于维护的权限管理系统。 ### 1. Spring Boot简介 Spring Boot是Spring框架的扩展,旨在简化Spring应用的初始搭建以及开发过程。它通过自动配置...

    axure后台管理系统原型.rar_Axure_Axure 后台管理_Axure、原型_Axure后台原型_后台原型

    "axure后台管理系统原型"这个项目,正是利用Axure的强大功能,构建出一套完善的后台管理界面原型。 首先,后台管理系统通常包括用户管理、权限控制、数据统计、操作日志等多个模块。在Axure中,这些模块可以通过...

    模拟电梯运行代码框架c

    在本文中,我们将深入探讨如何使用C语言和EGG库来构建一个模拟电梯运行的代码框架。EGG库,全称为“Embedded Graphics Generator”,是一个强大的图形用户界面(GUI)库,适用于开发各种图形应用程序,包括我们的...

    智慧校园管理系统教程。使用springboot开发,包含管理员管理,年级管理.zip

    SpringBoot提供了对MVC模式的良好支持,我们可以利用Spring的注解驱动来实现控制器、服务层和数据访问层的解耦。 数据库设计是智慧校园管理系统的重要组成部分。在这个系统中,可能需要创建如用户表、年级表、班级...

    后台管理框架axure原型模板

    通过利用这个“后台管理框架axure原型模板”,设计师能够快速建立一套完整的后台管理界面,而开发者也能依据原型进行编码,大大缩短项目周期并减少沟通成本。无论是在企业内部还是外包项目中,这样的模板都是提高...

    仓库管理系统 java

    9. **权限控制**:系统应包含用户管理和权限控制机制,如基于角色的访问控制(RBAC),确保不同角色的用户只能访问和操作其权限范围内的数据。 10. **异常处理与日志记录**:良好的异常处理和日志记录是系统稳定...

    河北省沧州市2021届高三下学期5月第二次模拟考试生物试题 Word版含答案.docx

    随着云计算技术的发展,许多教育机构开始利用云服务来存储和管理教育资源。比如,可以将文档上传至云端,学生和教师可以通过互联网访问这些资源,从而实现资源共享和远程教学的目的。 ### 7. 人工智能与机器学习 ...

    cpp-NSudo一个强大的系统管理工具

    这涉及到Windows API调用,尤其是与安全性和权限相关的API,如Token manipulation(令牌操作)和Impersonation(模拟)。 3. UAC(用户账户控制):NSudo能处理UAC机制,UAC是Windows Vista及更高版本引入的安全...

Global site tag (gtag.js) - Google Analytics