大佬教程收集整理的这篇文章主要介绍了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,请注明来意。