在实际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. vue js实现获取两个日期之间所有日期

    https://blog.csdn.net/m0_37852904/article/details/85790793 // 计算续住的总日期列表 getAll(begin, end) { let ar ...

  2. 【QT】qt python install pip

    https://pip.pypa.io/en/stable/installing/ http://www.runoob.com/w3cnote/python-pip-install-usage.htm ...

  3. 查找字符在字符串中第N次出现的位置

      1.查找字符串 @find 在字符串 @str 中第 (@n) 次出现的位置.没有第 (@n) 次返回 0. 返回@find在@str中第(@n)次出现的位置.没有第(@n)次返回0. ), ), ...

  4. Fiddler抓包【7】_次要功能和第三方插件

    1.替换HTTP Request Host 应用场景:进行开发时,线上去测试跳转调试 替换命令:urlreplace news.baidu.com www.baidu.com: 清除命令:urlrep ...

  5. 读C#图解教程的笔记

    第一章记录: 格式化字符串 Console.WriteLine("{0:D}", 123456789);//表示十进制字符串 Console.WriteLine("{0: ...

  6. Spring Boot:快速入门

    上一篇讲述什么是Spring Boot,这一篇讲解怎么使用IDE工具快速搭建起来独立项目. 一.构建方式 快速搭建项目有三种方式,官方也有答案给到我们: 二.构建前准备 想要使用IDE运行起来自己的S ...

  7. dom反转

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. QLayout删除所有布局

    Qt 的 QLayout 文档里是这么写的,但其实不完整,参看我最下面的代码. [pure virtual] QLayoutItem *QLayout::takeAt(int index) Must ...

  9. html5 css练习,弹性三栏布局

    *{    margin: 0;    padding: 0;} body,html{    width: 100%;    height: 100%;        font: bold 24px ...

  10. python selenium web自动化测试完整项目实例

    问题: 好多想不到的地方,中间经历了一次重构,好蛋疼: xpath定位使用的不够熟练,好多定位问题,只能靠强制等待解决: 存在功能重复的方法,因为xpath定位不同,只能分开写,有时间可以继续优化: ...