Spring Boot使用aop进行权限控制

Stella981
• 阅读 587

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

自定义一个注解@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方法分别作为页面和按钮的权限控制。

点赞
收藏
评论区
推荐文章
海军 海军
3年前
Vue权限路由[菜单权限/按钮权限控制]
前言&nbsp;&nbsp;&nbsp;年前完工了做了半年的铁路后台管理系统,系统整体业务比较复杂,这也是我到公司从0到1的一个完整系统实践,做这个系统过程中踩了不少坑,也学到了很多。</br&nbsp;做完这个系统没多久,紧接着又一个系统来了,没及时总结,惭愧哈!其实我们在做的后台管理系统大多数基础框架都一样,后台管理系统主要的是
kenx kenx
2年前
SpringBoot之SpringSecurity权限注解在方法上进行权限认证多种方式
前言SpringSecurity支持方法级别的权限控制。在此机制上,我们可以在任意层的任意方法上加入权限注解,加入注解的方法将自动被SpringSecurity保护起来,仅仅允许特定的用户访问,从而还到权限控制的目的,当然如果现有的权限注解不满足我们也可以自定义快速开始1.首先加入security依赖如下xmlorg.springframe
Stella981 Stella981
2年前
Shiro踩坑记(一):关于shiro
一)问题描述:我在一个Spring的项目中使用shiro搭建权限控制框架。主要通过shirospringbootwebstarter包快速集成Shiro。但是项目无法启动,报没有authorizer的bean的错误:Nobeannamed'authorizer'available
Stella981 Stella981
2年前
Spring Boot 之 RESRful API 权限控制
摘要:原创出处:www.bysocket.com(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.bysocket.com)泥瓦匠BYSocket希望转载,保留摘要,谢谢!“简单,踏实~读书写字放屁”一、为何用RESTfulAPI
Easter79 Easter79
2年前
Spring之@Transactional 注解配置详解
@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic@interfaceTransactional{@AliasFor("
Easter79 Easter79
2年前
SpringBoot自定义注解
JDK1.5起开始提供了4个元注解:@Target、@Retention、@Documented、@Inherited。何谓元注解?就是注解的注解。@Target({ElementType.PARAMETER,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@
Wesley13 Wesley13
2年前
Hbase权限控制
Hbase权限配置、使用手册1Hbase权限控制简介Hbase的权限控制是通过AccessControllerCoprocessor协处理器框架实现的,可实现对用户的RWXCA的权限控制。2配置配置hbasesite.xmlCM主页→点击hbase(进入Hbase
Stella981 Stella981
2年前
SpringBoot自定义注解
JDK1.5起开始提供了4个元注解:@Target、@Retention、@Documented、@Inherited。何谓元注解?就是注解的注解。@Target({ElementType.PARAMETER,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@
Wesley13 Wesley13
2年前
@Secured()、 @PreAuthorize() 、 @RolesAllowed()
在Springsecurity的使用中,为了对方法进行权限控制,通常采用的三个注解,就是@Secured()、@PreAuthorize()、@RolesAllowed()。示例,修改用户密码必须是ADMIN权限,可以用三种方法:@Secured({"ROLE_ADMIN"})publicvoidchangePassword(
Stella981 Stella981
2年前
Spring Security修炼手册(四)————Security默认表达式的权限控制
       前三章主要讲的是Security对于认证的处理,那么本节,会为大家介绍基于Security默认表达式的权限控制(较为简单,无法满足复杂权限控制及多变的权限规则,后面会介绍基于自定义表达式的权限访问控制,可满足99%的业务场景的需求)。一、介绍及使用 直接进入主题,基于默认的表达式权限控制,需要在SecurityConf