在实际web开发过程中通常会存在功能权限的控制,不如这个角色只允许拥有查询权限,这个角色拥有CRUD权限,当然按钮权限显示控制上可以用button.tld来控制,本文就不说明。

具体控制流程就是通过登录系统时候请求控制层将用户的所拥有功能权限查询出来存入session中,然后通过aop切面编程技术获取session里的功能权限与当前方法标签注解权限匹配,当存在则继续执行,若不存在,通过springmvc简单的异常重定向到自己的无权限页面。

1、配置注解方式

privilegeInfo.java

packagecom.tp.soft.common.util;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)public @interfacePrivilegeInfo {

String name()default "";

}

2、通过反射获取注解上的标签的封装类

PrivilegeInfoAnnotationParse.java

packagecom.tp.soft.common.util;importjava.lang.reflect.Method;public classPrivilegeInfoAnnotationParse {public static String parse(Class targetClass, String methodName) throwsNoSuchMethodException, SecurityException{

String privilegeName= "";

Method method=targetClass.getMethod(methodName);//判断方法上是否存在@PrivilegeInfo 注解

if(method.isAnnotationPresent(PrivilegeInfo.class)){//获取注解对象

PrivilegeInfo annotation = method.getAnnotation(PrivilegeInfo.class);//获取注解对象上的名字@PrivilegeInfo(name="admin")//即name为"admin"

privilegeName =annotation.name();

}returnprivilegeName;

}

}

3、创建控制层

LoginController.java

具体session创建在之前那一篇文章中有写到,通过拦截器创建的

packagecom.tp.soft.controller;importjava.util.ArrayList;importjava.util.List;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;importcom.tp.soft.common.util.SysContext;importcom.tp.soft.entity.Privilege;importcom.tp.soft.entity.User;

@Controllerpublic classLoginController {

@RequestMapping(value= "/login")publicModelAndView login() {//这里创建一个对象当做登录成功

User user = newUser();

user.setLogin_name("taop");

user.setLogin_pwd("1");//登录查询

if (user != null) {//根据用户查询出所有权限,本来存入数据库,这边就生动生成taop的权限//不如只有添加权限

Privilege privilege = newPrivilege();

privilege.setName("query");

privilege.setDesc("查詢权限");

List privilegeList = new ArrayList();

privilegeList.add(privilege);

SysContext.getSession().setAttribute("privileges", privilegeList);

SysContext.getSession().setAttribute("user", user);return new ModelAndView("/pc/main");

}return null;

}

@RequestMapping(value="/toHasNoPower")publicModelAndView toHasNoPower(){return new ModelAndView("/pc/privilege/noPower");

}

}

UserController.java

packagecom.tp.soft.controller;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.annotation.Resource;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;importcom.tp.soft.common.util.PrivilegeInfo;importcom.tp.soft.common.util.SysContext;importcom.tp.soft.entity.Privilege;importcom.tp.soft.entity.User;importcom.tp.soft.service.login.LoginSvc;importcom.tp.soft.service.sys.UserSvc;

@Controllerpublic classUserController {

@ResourceprivateUserSvc userSvc;

@ResourceprivateLoginSvc loginSvc;

@RequestMapping(value="/toQueryUser")

@PrivilegeInfo(name="query")publicModelAndView toQueryUser(){

User user= userSvc.getUser(21);

Map map = new HashMap();

map.put("user", user);return new ModelAndView("/pc/userTest");

}

}

@PrivilegeInfo(name="query") 可以通过数组的形式 如name={"query", "add"}

创建异常类

AssessDeniedException.java

packagecom.tp.soft.common.exception;public class AssessDeniedException extendsRuntimeException{/****/

private static final long serialVersionUID = 5188167616201017971L;publicAssessDeniedException() {super();//TODO Auto-generated constructor stub

}publicAssessDeniedException(String message, Throwable cause,boolean enableSuppression, booleanwritableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);//TODO Auto-generated constructor stub

}publicAssessDeniedException(String message, Throwable cause) {super(message, cause);//TODO Auto-generated constructor stub

}publicAssessDeniedException(String message) {super(message);//TODO Auto-generated constructor stub

}publicAssessDeniedException(Throwable cause) {super(cause);//TODO Auto-generated constructor stub

}

}

创建权限对象

Privilege.java

public classPrivilege {private intpid;privateString name;privateString desc;

...省略set get

}

4、配置aop切面类

AdminAspect.java

packagecom.tp.soft.aop;importjava.util.List;importjavax.servlet.http.HttpSession;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Pointcut;importcom.tp.soft.common.exception.AssessDeniedException;importcom.tp.soft.common.util.PrivilegeInfoAnnotationParse;importcom.tp.soft.common.util.SysContext;importcom.tp.soft.entity.Privilege;importcom.tp.soft.entity.User;

@Aspectpublic classAdminAspect {

@Pointcut("execution(* com.tp.soft.controller..*.*(..)) && !execution(* com.tp.soft.controller.LoginController.*(..))")public voidpointCutMethod(){

}

@Around("pointCutMethod()")public Object dealPrivilege(ProceedingJoinPoint jpj) throwsThrowable{//获取请求的类和方法名

Class extends Object> cls =jpj.getTarget().getClass();

String name=jpj.getSignature().getName();

System.out.println(cls);

System.out.println(name);//获取注解上的标签

String privilegeName =PrivilegeInfoAnnotationParse.parse(cls, name);

HttpSession session=SysContext.getSession();

User user= (User) session.getAttribute("user");

List privileges = (List) session.getAttribute("privileges");if(user == null){throw new AssessDeniedException("您无权操作!");

}//是否通过访问

boolean flag = false;if(privilegeName == "" || privilegeName == null){

flag= true;

}else{for(Privilege privilege : privileges) {if(privilegeName.equals(privilege.getName())){//用户访问权限(add) 是否包含当前方法的访问权限

flag = true;break;

}

}

}if(flag){returnjpj.proceed();

}else{//权限不足

System.out.println("权限不足");throw new AssessDeniedException("您无权操作!");

}

}

}

配置spring-mvc.xml 异常类重定向跳转

forward:/toHasNoPower

当无权限抛出异常时候即会重定向到toHashNoPower 然后modelandview 自己写的一个无权限的页面

至此全部结束

请求结果:当直接访问查询方法

当访问

再访问

当将权限设置成

继续访问

java按钮权限控制_aop (权限控制之功能权限)相关推荐

  1. 【权限设计】最好的权限设计,是先区分功能权限和数据权限

    本文为我们介绍了功能权限和数据权限的不同点.以及不同部分中的要点与注意事项. 做2B的系统总是不可回避的遇上权限问题,他不是核心业务却又必不可少,而且总是牵一发而动全身,更要命的是不同客户组织架构完全 ...

  2. java防止用户越权访问文件_针对功能权限(url访问)如何避免越权访问

    uva 11324 Problem B: The Largest Clique Given a directed graph G, consider the following transformat ...

  3. java aop日志记录_AOP实现日志记录功能

    场景:整个系统的DML操作需要记录日志 记录内容:1 操作人 2 操作时间 3 操作类型(登录 新增 修改 删除) 4 操作描述  5 详细请求数据(varchar2()) 6 操作IP  ==> ...

  4. java 位掩码_Java位掩码控制权限与()或(|)非(~)、的介绍

    1. java 位掩码 java 位掩码,在java开发中很少有场景会用到掩码,但是当系统中需要判断某个对象是否有 某些权限时,可以通过位掩码来做. 位掩码 主要通过位运算,例如与(&).非( ...

  5. java 数据 权限_Java如何利用Mybatis进行数据权限控制详解

    前言 权限控制主要分为两块,认证(Authentication)与授权(Authorization).认证之后确认了身份正确,业务系统就会进行授权,现在业界比较流行的模型就是RBAC(Role-Bas ...

  6. AppBoxPro - 细粒度通用权限管理框架(可控制表格行内按钮)源码提供下载

    2019独角兽企业重金招聘Python工程师标准>>> 特别声明: 提供的源代码已经包含了 AppBoxPro 的全部源代码,用 VS2012 打开项目后,直接 Ctrl+F5 可以 ...

  7. java 权限控制 demo_Java-访问控制权限

    Java面向对象-访问控制权限 Java中,可以通过一些Java关键字,来设置访问控制权限: 主要有 private(私有), package(包访问权限),protected(子类访问权限),pub ...

  8. Java学习笔记10---访问权限修饰符如何控制成员变量、成员方法及类的访问范围...

    1.Java有三种访问权限修饰符,分别为public.protected.private,还有一种为缺省权限修饰符的情况,记为default.其中,可以由public和default来修饰类:这四种修 ...

  9. mysql最细粒度的权限是什么_粗粒度与细粒度权限控制

    1.1 什么是粗粒度和细粒度权限 粗粒度权限管理,对资源类型的权限管理.资源类型比如:菜单.url连接.用户添加页面.用户信息.类方法.页面中按钮.. 粗粒度权限管理比如:超级管理员可以访问户添加页面 ...

最新文章

  1. 185.dubbo 后台管理系统
  2. 一名毕业三年的女程序媛面试头条经验,重难点整理
  3. 解决 C/C++ 程序执行后控制台一闪而过的方法
  4. Chrome MessageLoop类分析
  5. 究竟哪种取数据的方式最快?
  6. MTK 驱动开发(54)---MTK-thermal.conf温度参数修改的方法
  7. Mac电脑直接拔掉U盘和移动硬盘会有什么影响
  8. MIPI D-PHY IP 使用说明(二)
  9. 四川省副高级职称计算机考试试题,四川省职称计算机考试题库.doc
  10. 百度 计算广告学学习记录
  11. Google官方架构MVI
  12. 英国AI创业公司Hazy获180万美元种子轮融资
  13. 46 同位语和同位语从句(以及) to/at/for/with 用法搭配
  14. 网红为什么能增加ROI?什么样的网红才能增加ROI
  15. 电脑重装系统数据恢复方法教程
  16. 数据库(mysql)基本概念
  17. 数据安全加密技术分析
  18. html伪类选择器focus,了解CSS :focus-within伪类选择器
  19. 一步一步在平衡车上实现卡尔曼滤波
  20. 学习笔记-频率域滤波(2)-取样函数

热门文章

  1. 简述created和mounted的区别
  2. 初级计算机信息处理员笔试题,初级信息处理技术员计算机系统基础知识考试卷模拟考试^题...
  3. CSS的三种布局方式
  4. 那些靠互联网年赚百万的大佬们是如何赚钱的?
  5. zcmu oj 1087: 统计字符
  6. 非常详细的hi3559A概念版用户手册
  7. kubernetes二进制安装
  8. web.xml中security-constraint安全认证标签说明
  9. 组件封装 - steps组件
  10. 12306查询车票(爬虫小练_1)