Spring,AOP实现功能级别权限验证

1. 首先是问题出现的原因

对于一个我的一个个人博客网站,我希望游客可以浏览我的博客,但是评论功能是需要登录才能使用
这就需要对某个功能进行权限验证
对于过滤器,拦截器,AOP的区别日后再讨论,现在是功能的实现

2. 具体实现

我希望对于标注了注解的方法上都进行功能权限验证
我们哪一个员工管理进行示例
对于删除方法我们进行权限验证,如果登陆,则能删除,否则不能删除

1. 首先创建一个注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SecurityCheck {
    
}

2. 接下来创建一个切面类

@Aspect
@Component
public class SecurityAspect {

    @Pointcut("@annotation(com.xj.annotation.SecurityCheck)")
    public void pointCut() {
    }

    @Around("pointCut()")
    public Object checkSecurity(ProceedingJoinPoint joinPoint) {
        System.out.println("checkSecurity");
        try {
            //获取session对象,至于RequestContextHolder是什么,为什么能获取request对象,我之后会再讨论
            RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            HttpSession session = request.getSession();
            String user = (String) session.getAttribute("user");
            
            if ("1".equals(user)) {
                return joinPoint.proceed();
            } else {
                return Message.fail().add("va_msg","权限不够");
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return Message.fail().add("va_msg","发生错误");
        }
    }
}

3. 为需要被验证的方法上加注解

    @SecurityCheck
    @RequestMapping(value = "/emp/{ids}", method = RequestMethod.DELETE)
    @ResponseBody
    public Message deleteEmp(@PathVariable("ids") String ids){
        //以下是删除的逻辑,这里就不展示了
        ....
        return Message.success();
    }

4. 之后在扫描了Controller组件的容器中,开启基于注解的AOP模式

注意:对于我的ssm项目来说,我的spring与springmvc容器是分开的,spring扫描除了Controller注解的类,springmvc值扫描Controller注解的类
所以如果你想对其他类的方法进行权限验证,例如Service中的一个功能进行验证,就需要在spring的配置文件中也加上以下配置

    <aop:aspectj-autoproxy/>

5. 测试

  • 如果未登录

  • 如果登陆

posted @ 2020-09-12 11:18  微花  阅读(536)  评论(0)    收藏  举报

Loading