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

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

1、配置注解方式

privilegeInfo.java

package com.tp.soft.common.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrivilegeInfo {
String name() default "";
}

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

PrivilegeInfoAnnotationParse.java

package com.tp.soft.common.util;

import java.lang.reflect.Method;

public class PrivilegeInfoAnnotationParse {
public static String parse(Class targetClass, String methodName) throws NoSuchMethodException, 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(); }
return privilegeName;
}
}

3、创建控制层

LoginController.java

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

package com.tp.soft.controller;

import java.util.ArrayList;
import java.util.List; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import com.tp.soft.common.util.SysContext;
import com.tp.soft.entity.Privilege;
import com.tp.soft.entity.User; @Controller
public class LoginController { @RequestMapping(value = "/login")
public ModelAndView login() {
// 这里创建一个对象当做登录成功
User user = new User();
user.setLogin_name("taop");
user.setLogin_pwd("1"); // 登录查询
if (user != null) {
// 根据用户查询出所有权限,本来存入数据库,这边就生动生成taop的权限
// 不如只有添加权限
Privilege privilege = new Privilege();
privilege.setName("query");
privilege.setDesc("查詢权限");
List<Privilege> privilegeList = new ArrayList<Privilege>();
privilegeList.add(privilege);
SysContext.getSession().setAttribute("privileges", privilegeList);
SysContext.getSession().setAttribute("user", user);
return new ModelAndView("/pc/main");
} return null;
} @RequestMapping(value="/toHasNoPower")
public ModelAndView toHasNoPower(){
return new ModelAndView("/pc/privilege/noPower");
}
}

UserController.java

package com.tp.soft.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import com.tp.soft.common.util.PrivilegeInfo;
import com.tp.soft.common.util.SysContext;
import com.tp.soft.entity.Privilege;
import com.tp.soft.entity.User;
import com.tp.soft.service.login.LoginSvc;
import com.tp.soft.service.sys.UserSvc; @Controller
public class UserController { @Resource
private UserSvc userSvc; @Resource
private LoginSvc loginSvc; @RequestMapping(value="/toQueryUser")
@PrivilegeInfo(name="query")
public ModelAndView toQueryUser(){
User user = userSvc.getUser(21);
Map<String, Object> map = new HashMap<String, Object>();
map.put("user", user);
return new ModelAndView("/pc/userTest");
} }
@PrivilegeInfo(name="query") 可以通过数组的形式 如name={"query", "add"}

创建异常类

AssessDeniedException.java

package com.tp.soft.common.exception;

public class AssessDeniedException extends RuntimeException{

    /**
*
*/
private static final long serialVersionUID = 5188167616201017971L; public AssessDeniedException() {
super();
// TODO Auto-generated constructor stub
} public AssessDeniedException(String message, Throwable cause,
boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
} public AssessDeniedException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
} public AssessDeniedException(String message) {
super(message);
// TODO Auto-generated constructor stub
} public AssessDeniedException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
} }

创建权限对象

Privilege.java

public class Privilege {
private int pid;
private String name;
private String desc; ...省略set get
}

4、配置aop切面类

AdminAspect.java

package com.tp.soft.aop;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; import com.tp.soft.common.exception.AssessDeniedException;
import com.tp.soft.common.util.PrivilegeInfoAnnotationParse;
import com.tp.soft.common.util.SysContext;
import com.tp.soft.entity.Privilege;
import com.tp.soft.entity.User; @Aspect
public class AdminAspect { @Pointcut("execution(* com.tp.soft.controller..*.*(..)) && !execution(* com.tp.soft.controller.LoginController.*(..))")
public void pointCutMethod(){ } @Around("pointCutMethod()")
public Object dealPrivilege(ProceedingJoinPoint jpj) throws Throwable{
//获取请求的类和方法名
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<Privilege> privileges = (List<Privilege>) 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){
return jpj.proceed();
}else{
//权限不足
System.out.println("权限不足");
throw new AssessDeniedException("您无权操作!");
}
}
}

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

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.tp.soft.common.exception.AssessDeniedException">forward:/toHasNoPower</prop>
</props>
</property>
</bean>

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

至此全部结束

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

当访问

再访问

当将权限设置成

继续访问

aop (权限控制之功能权限)的更多相关文章

  1. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

  2. asp.net core mvc权限控制:分配权限

    前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Ident ...

  3. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

  4. Linux系统——ACL权限控制及特殊权限

    ACL权限控制 ACL(access control list),可以提供除属主.属组.其他人的rwx权限之外的细节权限设定 ACL的权限控制 (1)User 使用者 (2)Group 群组 (3)M ...

  5. umask 默认权限控制和特殊权限

    权限简单介绍: 在Linux中,创建目录或者文件之后总会有默认的权限.共9个,分为三组.分别代表u.g.o(属主.属组.其他用户).r.w.x 也代表各自的权限. r:读   在文件中的权限代表次文件 ...

  6. Laravel 5.1 ACL权限控制 三 之权限准备及实现权限管理

    请自动参照到上上篇文章 1.创建控制器 php artisan make:model Permission php artisan make:model Role 2.创建表 php artisan ...

  7. Chapter6_访问权限控制_访问权限修饰词

    Java中有四种访问权限,public,private,protected和包访问权限,它们是置于类中每一个成员之前的定义,无论是一个域还是一个方法,下面一一介绍. 一.包访问权限 如果不提供任何访问 ...

  8. Spring AOP 实现功能权限校验功能

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 使用拦截器实现未登录时跳转到登录界面的功能 1 拦截器SecurityInterceptor 2spring-mvcxml拦 ...

  9. 循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

    在一个业务管理系统中,如果我们需要实现权限控制功能,我们需要定义好对应的权限功能点,然后在界面中对界面元素的功能点进行绑定,这样就可以在后台动态分配权限进行动态控制了,一般来说,权限功能点是针对角色进 ...

随机推荐

  1. 20175201课下作业 MyCP

    要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容为十进 ...

  2. [js]展开运算符

    function f(...args){ console.log(args); } f(1,2,3,4,5) [...args] = [1,2,3,4] function f(...args){ co ...

  3. 面试 Java 高级后端开发,要准备哪些知识点?

    其实公司肯花时间让你去面试,前提条件一定是通过你的简历,一定发现了你和公司的匹配点,也就是说,一定是有录用意向的. 在技术面试的时间段里(最长1个小时),你如果能展现你的优势那是最好的,但如果你做不到 ...

  4. Jmeter GIS调用-->参数化+正则表达式提取器+后置处理器+逻辑控制器

    一.参数化: 1.添加线程组 2.添加HTTP请求 3.CSV 数据文件设置 HTTP请求参数话 4.正则表达式提取器 5.逻辑控制器 可以or    and 等 6.后置处理器写入文件 FileWr ...

  5. ShowWindow 隐藏、显示、最大化、最小化窗口

    #include <Windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTA ...

  6. CentOS 7 搭建Squid代理服务器

    Squid安装 官方地址:http://www.squid-cache.org/ [root@DaMoWang ~]# -r6d8f397.tar.gz [root@DaMoWang ~]# -r6d ...

  7. python,day3,函数基础-3

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数基本语法及特性 函数是什么? 函数一词 ...

  8. JavaScript中的转译符

    转译字符 含义     \o NUL字符(\u0000) \b 退格符(\u0008) \t 水平制表符(\u0009) \n 换行符(\u000A) \v 垂直制表符(\u000B) \f 换页符( ...

  9. echarts 图的点击事件(含:点击重复触发的问题及其解决方法)

    今天用echarts的时候发现一个问题 鼠标指向不同地市触发一个事件展示该地区趋势图  但是但是后台中不管我第几次鼠标指向都会触发两次指向事件 现在贴出解决办法: 问题完美解决.但是为什么会调用两次, ...

  10. Java内存区域与内存溢出异常(JVM学习系列1)

    相对于C.C++等语言来说,Java语言一个很美好的特性就是自动内存管理机制.C语言等在申请堆内存时,需要malloc内存,用完还有手动进行free操作,若程序员忘记回收内存,那这块内存就只能在进程退 ...