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. 测试
-
如果未登录

-
如果登陆

本博客文章主要供博主学习交流用,所有描述、代码无法保证准确性,如有问题可以留言共同讨论。

浙公网安备 33010602011771号