编程语言   发布时间:2022-06-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了AOP模拟权限检测大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

使用AOP切面层模拟实现权限的检测的功能

在entity层创建用户实体类


public class User {
    private int id;

    private String username;

    private String email;

    private String address;

    public User() {
    }

    public User(int id, String username, String email, String address) {
        this.id = id;
        this.username = username;
        this.email = email;
        this.address = address;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + ''' +
                ", email='" + email + ''' +
                ", address='" + address + ''' +
                '}';
    }
}

在DAO层,Service层接口中创建 方法

public interface UserService {
    User queryUserBuId(int id);

    void updateUser(User user);

    void registUser(User user);

    void delectUserById(int id);
}
public interface UserDao {
    User queryUserBuId(int id);

    void updateUser(User user);

    void registUser(User user);

    void delectUserById(int id);
}

同样创建UserDaoImpl,UserServiecImpl实现类,实现接口中的方法

在配置文件中开启包扫描,aop注解驱动

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">

<!--    开启包扫描-->
    <context:component-scan base-package="com.javasm"></context:component-scan>
<!--    开启驱动注解-->
    <aop:aspectj-autoproxy/>
</beans>

创建枚举类,定义用户


public enum PrivEnum {
    CUST,USER,ADMIN
}

 

创建注解接口,设置注解的作用域和生命周期

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 PrivAnno {
    PrivEnum[] value() default PrivEnum.CUST;
}

 在UserServiceImpl实现类中添中为增删该查上添加注解(可以让哪些用户使用)

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Override
    @PrivAnno({PrivEnum.ADMIN,PrivEnum.USER})
    public User queryUserBuId(int id) {
        return userDao.queryUserBuId(id);
    }

    @Override
    @PrivAnno({PrivEnum.ADMIN,PrivEnum.USER})
    public void updateUser(User user) {
        userDao.updateUser(user);
    }

    @Override
    public void registUser(User user) {
        userDao.registUser(user);
    }

    @Override
    @PrivAnno({PrivEnum.ADMIN})
    public void delectUserById(int id) {
        userDao.delectUserById(id);
    }
}

创建测试类 模拟用户权限(模拟数值)


public class TestDemo {
    //假设的用户权限
    public static PrivEnum role = PrivEnum.USER;
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserController userController = applicationContext.getBean(UserController.class);
        User user = userController.queryUserById(1);
        User user1 = new User(2,"li","li@qq.com","北京");
        userController.regisUser(user1);
        userController.deleteUserById(2);
    }
}

创建切面层,在切面层中查询用户的权限,增强方法


@Component
@Aspect
public class PrivAspect {

    @Around("execution(* com.javasm.service..*.*(..))")
    public Object privAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //获取目标方法 如果是接口,默认获取的是目标接口的方法
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        //接口的方法
        Method method = signature.getMethod();
        //获取目标对象的方法
        Object target = proceedingJoinPoint.getTarget();
        Method instanceMethod = target.getClass().getMethod(method.getName(),method.getParameterTypes());
        //判断目标方法是否需要权限检查
        if (instanceMethod.isAnnotationPresent(PrivAnno.class)){
            //判断目标是否有PrivAnno注解
            //如果有,说明需要检查
            //获取目标方法上的面的注解
            PrivAnno annotation = instanceMethod.getAnnotation(PrivAnno.class);
            PrivEnum[] value = annotation.value();
            if (Arrays.asList(value).contains(TestDemo.role)){
                //有权限 放行
                return proceedingJoinPoint.proceed();
            }else {
                //没有权限
                throw new RuntimeException("权限不足");
            }
        }else {
            //没有对应的注解,直接放行
            return proceedingJoinPoint.proceed();
        }

    }
}

 

待。。。。

 

大佬总结

以上是大佬教程为你收集整理的AOP模拟权限检测全部内容,希望文章能够帮你解决AOP模拟权限检测所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: