SpringBoot 使用AOP校验用户

没啥用,写来玩的
需求:

系统有两种用户类型

  1. 管理员
  2. 普通用户

因为系统简单没有使用权限框架来进行校验拦截

建立一个SpringBoot项目
添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

pojo

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer userType;
}

用户类型枚举

@AllArgsConstructor
@Getter
public enum UserTypeEnum {
    ADMIN(1,"管理员"),
    USER(2,"普通用户");
    private Integer typeCode;
    private String  msg;
}

权限注解

// 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AdminOnly {
}

AuthService

@Component
public class AuthService {
    public void checkUser(){
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        User user =  (User) request.getSession().getAttribute("user");
        if(!user.getUserType().equals(UserTypeEnum.ADMIN.getTypeCode())){
            throw new DemoException(401,"权限不足");
        }
    }
}

aop切面

@Aspect
@Component
@Slf4j
public class AuthAspect {
    @Autowired
    private AuthService authService;
    @Pointcut("@annotation(AdminOnly)")
    public void adminOnly(){

        log.info("执行 adminOnly()");
    }

    @Before("adminOnly()")
    public void check(){
        log.info("Before 执行 check()");
        authService.checkUser();
    }
}

自定义异常

public class DemoException  extends RuntimeException{
    private Integer code;

    public DemoException( Integer code,String message) {
        super(message);
        this.code = code;
    }
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
}

全局统一异常处理

@ControllerAdvice
public class DemoExceptionHandler {
   @ExceptionHandler(Exception.class)
   @ResponseBody
    public Map<String,Object> demoExceptionHandler(Exception e){
       Map<String,Object> map =  new HashMap<>();
       if(e instanceof DemoException){
           DemoException demoException = (DemoException) e;
           map.put("code",demoException.getCode());
           map.put("msg",demoException.getMessage());
       }else {
           map.put("code",-1);
           map.put("msg",e.getMessage());
       }
       return map;
   }
}

Controler

@RestController
@Slf4j
public class UserController {
    // 初始化模拟数据
    public static List<User> userList = new ArrayList<>();
    static {
        userList.add(new User(1, "admin", "12345",1));
        userList.add(new User(2, "zhangsan", "zhangsan",2));
        userList.add(new User(3, "jojo", "jojo",2));
    }

    @GetMapping("/login")
    public String login(@RequestParam String username,
                        @RequestParam String password,
                        HttpServletRequest request){
        //验证用户名密码
        Optional<User> first = userList.stream().filter(u -> u.getUsername().equals(username) && u.getPassword().equals(password)).findFirst();
        if(!first.isPresent()){
            return "用户名或者密码错误";
        }
        User user = first.get();
        request.getSession().setAttribute("user",user);

        return "登录成功";
    }

    @GetMapping("/index")
    public String index(){
        return "index";
    }

    @GetMapping("/user/list")
    @AdminOnly
    public String list(){
        return "访问成功,说明你拥有权限";
    }
}
  • 普通用户登录后访问带@AdminOnly的url
    在这里插入图片描述
  • 管理员登录后访问带@AdminOnly的url
    在这里插入图片描述

总结:感觉还是定义拦截器或者权限框架实用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架,它提供了丰富的功能和特性,方便开发人员快速搭建和开发项目。 在Spring Boot使用AOP(面向切面编程)可以实现将一些公共的功能逻辑代码从业务逻辑代码中解耦出来,提高代码的复用性和可维护性。通过AOP可以在方法的前后注入一些通用的逻辑,例如日志记录、异常处理、权限校验等。 其中,使用AOP进行结果的统一封装是很常见的需求。通过AOP可以在方法执行后对返回的结果进行封装,统一处理返回结果的格式,并可以对结果进行一些统一的处理操作,例如添加统一的返回码、返回信息、返回时间等。 在Spring Boot使用AOP进行结果的统一封装可以按照以下步骤进行: 1. 创建一个切面(Aspect),通过在切面类上加上@Aspect注解标识该类是一个切面类。 2. 在切面类中定义一个切点(Pointcut),通过定义一个方法并添加@Pointcut注解来指定切入点。 3. 在切面类中定义一个通知(Advice),通过@Before、@After、@Around等注解来指定通知类型,并在通知方法中编写需要执行的逻辑。 4. 在通知方法中获取方法的返回结果,并进行相应的封装和处理。 5. 在Spring Boot的配置类中添加@EnableAspectJAutoProxy注解来启用AOP使用以上步骤可以实现对方法返回结果的统一封装,使得返回结果具有统一的格式和处理逻辑。这样可以提高代码的重用性和可维护性,并且可以在一处对结果进行集中处理,减少了代码的重复性,提高了开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值