文档章节

Spring Boot使用aop进行权限控制

何须一丝不挂
 何须一丝不挂
发布于 2016/08/28 22:44
字数 592
阅读 1071
收藏 4

项目中需要用到权限控制,简单的方案记录下。

自定义一个注解@CheckPermission。

/**
 * 检查权限
 * @author yanyimin
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckPermission {

}

aop中实现的方法:

@Configuration
@Aspect
public class PermissionProxy extends BaseLogger{
	@Autowired
	AdminService adminService;
	@Autowired
	PermissionCache permissionCache;
	
	@Around("@annotation(com.runrong.managecenter.business.aop.CheckPermission)")
	public Object check(ProceedingJoinPoint point) throws Throwable {
		MethodSignature signature = (MethodSignature) point.getSignature();
		//获取被代理方法的类名
		String className=signature.getDeclaringTypeName();
		//获取被代理的方法名
        Method method = signature.getMethod();
		String methodName=method.getName();
		//通过方法参数获取到session,拿到用户信息
        for (Object arg : point.getArgs()) {
            if (!(arg instanceof HttpServletRequest)) {
                continue;
            }
            HttpServletRequest request = (HttpServletRequest) arg;
            HttpSession session =request.getSession();
            //拿到储存在session中的用户id
            int id=(int) session.getAttribute("admin_id");
            //拿到储存在session中的用户类型
            int type=(int) session.getAttribute("admin_type");
            
            //0:超级管理员,1:管理员
            //当用户为超级管理员时,拥有所有权限,可以通过权限检查的方法。
            if(type==0){
            	return point.proceed();
            }
            
            //每次都需要查询数据库  权限验证较为频繁可以引入缓存
            List<String> permission;
            if(permissionCache.get(String.valueOf(id)) == null){
            	//根据用户id获取用户权限
            	permission=adminService.getAdminPermission(id);
            	//写入缓存中
            	permissionCache.put(String.valueOf(id),permission);
            }else{
            	//logger.info("用户:"+id+",从缓存中验证权限:"+className+"_"+methodName);
            	permission=permissionCache.get(String.valueOf(id));
            }                     
            
            //如果用户权限中包含aop代理下的方法,则该用户权限验证通过                   
    		if(permission.contains(className+"_"+methodName)){
    			return point.proceed();   		
    		}
    		
    		//按钮采用post方法,通过ajax调用返回json串,提示无权限
    		if(methodName.endsWith("POST")){
    			return ResultModel.successModel("无权限使用此功能");
    		}
    		//进入页面采用get方法,若无权限则进行页面跳转
    		return new ModelAndView("redirect:/managecenter/nopermission.html");    		
        }
        
        throw new RuntimeException("the method which use @CheckPermission must has a HttpServletRequest as Parameter");

    }
}

在controller中需要实现权限控制的方法上加上此注解:

/**
 * 管理员账号控制层
 * @author yanyimin
 *
 */
@Controller
@RequestMapping("/managecenter")
public class AdminController {
	
	@Autowired
	AdminService adminService;
	
	/**
	 * 添加管理员
	 * @param request
	 * @return
	 */
	@RequestMapping(value="/addAdministrator" ,method=RequestMethod.GET)
	@CheckPermission
	public ModelAndView addAdministratorGET(HttpServletRequest request) {
		return new ModelAndView("/managecenter/addAdministrator");
	}
	
	/**
	 * 添加管理员
	 * @param request
	 * @return
	 */
	@RequestMapping(value="/addAdministrator" ,method=RequestMethod.POST)
	@ResponseBody
	@CheckPermission
	public ResultModel addAdministratorPOST(HttpServletRequest request){
		return adminService.addAdministrator(request);
	}
}

这样在使用添加管理员这个功能时,会先进入到aop中进行权限的检查。

权限使用类名+方法名的方式储存在数据库中,用get、post方法分别作为页面和按钮的权限控制。

 

© 著作权归作者所有

何须一丝不挂
粉丝 1
博文 3
码字总数 5239
作品 0
广州
程序员
私信 提问
spring boot 集成shiro ,使用aspect记录日志不生效

现在我用了spring boot shiro 做我权限控制,用spring boot aspect来做我的日志记录,拦截的是controller层。但是现在我的shiro配置没有什么问题,权限可以控制。但是我用aspect记录日志的地...

王晓哲
2018/08/13
1K
1
新书上架:《Spring Boot 开发实战》(基于 Kotlin + Gradle + Spring Boot 2.0 的企业级服务端开发实战)

新书上架:《Spring Boot 开发实战》 — 基于 Kotlin + Gradle + Spring Boot 2.0 的企业级服务端开发实战 京东下单链接 https://item.jd.com/31178320122.html 天猫下单链接 https://detail...

程序员诗人
2018/08/05
0
0
新书上架:《Spring Boot 开发实战》基于 Kotlin + Gradle + Spring Boot 2.0 的企业级服务端开发实战

新书上架:《Spring Boot 开发实战》 — 基于 Kotlin + Gradle + Spring Boot 2.0 的企业级服务端开发实战 京东下单链接 https://item.jd.com/31178320122.html 天猫下单链接 https://detail...

程序员诗人
2018/08/22
0
0
《深入理解Spring Cloud与微服务构建》第7章 Spring Boot Security详解

1、Spring Security简介 1.1 什么是Spring Security Spring Security是Spring Resource社区的一个安全组件,Spring Security为JavaEE企业级开发提供了全面的安全防护。安全防护是一个不断变化...

Lienson
04/08
98
2
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait
2018/06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
8
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部