aop (权限控制之功能权限)
在实际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 (权限控制之功能权限)的更多相关文章
- JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理
1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...
- asp.net core mvc权限控制:分配权限
前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Ident ...
- Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制
一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...
- Linux系统——ACL权限控制及特殊权限
ACL权限控制 ACL(access control list),可以提供除属主.属组.其他人的rwx权限之外的细节权限设定 ACL的权限控制 (1)User 使用者 (2)Group 群组 (3)M ...
- umask 默认权限控制和特殊权限
权限简单介绍: 在Linux中,创建目录或者文件之后总会有默认的权限.共9个,分为三组.分别代表u.g.o(属主.属组.其他用户).r.w.x 也代表各自的权限. r:读 在文件中的权限代表次文件 ...
- Laravel 5.1 ACL权限控制 三 之权限准备及实现权限管理
请自动参照到上上篇文章 1.创建控制器 php artisan make:model Permission php artisan make:model Role 2.创建表 php artisan ...
- Chapter6_访问权限控制_访问权限修饰词
Java中有四种访问权限,public,private,protected和包访问权限,它们是置于类中每一个成员之前的定义,无论是一个域还是一个方法,下面一一介绍. 一.包访问权限 如果不提供任何访问 ...
- Spring AOP 实现功能权限校验功能
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 使用拦截器实现未登录时跳转到登录界面的功能 1 拦截器SecurityInterceptor 2spring-mvcxml拦 ...
- 循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制
在一个业务管理系统中,如果我们需要实现权限控制功能,我们需要定义好对应的权限功能点,然后在界面中对界面元素的功能点进行绑定,这样就可以在后台动态分配权限进行动态控制了,一般来说,权限功能点是针对角色进 ...
随机推荐
- centos修改时区并同步时间
查看服务器时间及所在时区 [root@localhost ~]# date -R Fri, 07 Dec 2018 04:38:28 -0500 修改时区 先使用 tzselect 根据提示选择所在地 ...
- JAVA反射机制及理解
JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...
- 6#day2总结
一次小小的总结https://github.com/DuGuQiuBai/Java/blob/master/day02/day02%E6%80%BB%E7%BB%93.txt 1:常量(掌握) (1) ...
- java学习之静态内部类
/*静态内部类 * 在类内部定义一个静态内部类 * 静态的含义是该内部类可以向其他静态成员一样,不用依赖与外部类的对象.可以直接使用 * 因此该类只能访问外部类的静态成员 * * * * */ cla ...
- CentOS 7 搭建Squid代理服务器
Squid安装 官方地址:http://www.squid-cache.org/ [root@DaMoWang ~]# -r6d8f397.tar.gz [root@DaMoWang ~]# -r6d ...
- jpa数据库表实体命名规则 Unknown column 'user0_.create_time' in 'field list'
数据库,表字段命名是驼峰命名法(createTime),Spring data jpa 在操作表的时候,生成的sql语句中却是create_time, 表字段不对照, Spring data jpa基 ...
- mysql数据库设计三范式
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...
- angular 4 实战开发--安卓兼容问题(1)
首先我强调下我只是个菜鸟,大神不喜勿喷. 先介绍下项目背景,主要是公司的官网h5 ,架构用的是angular4 有点大材小用的赶脚,but ,公司要求. 在项目主功能做的差不多了.交给测试,这时候发现 ...
- WebForm文件上传
用 FileUpload控件进行上传文件. <asp:FileUpload ID="FileUpload1" runat="server" /> ...
- python小知识点随笔
可能会有不局限于Python语言的内容,文中“>>>”表示结果,而不是命令行交互的提示符 1.关于字符串编码 ASCII编码 占用一个字节 二进制11111111=十进制255 所以 ...