Shiro等权限管理框架本质很简单,一个注解+拦截器就可实现

测试类

public class Apple {

// 当只想给value赋值时,可以使用如下快捷方式

// @FruitName(“apple”)

// 当多个属性赋值时,必须采用key=value的形式

@FruitName(value = “apple”, alias = “iphone”)

private String name;

@FruitColor(fruitColor = Color.RED)

private String color;

public static void main(String[] args) {

Field[] fields = Apple.class.getDeclaredFields();

for (Field field : fields) {

if (field.isAnnotationPresent(FruitName.class)) {

FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);

// fruitName is apple

System.out.println("fruitName is " + fruitName.value());

// alias is iphone

System.out.println("alias is " + fruitName.alias());

} else if (field.isAnnotationPresent(FruitColor.class)) {

FruitColor fruitColor = (FruitColor) field.getAnnotation(FruitColor.class);

// fruitColor is RED

System.out.println("fruitColor is " + fruitColor.fruitColor().name());

}

}

}

}

Shiro等权限管理框架本质很简单,一个注解+拦截器就可实现

自定义注解+拦截器实现权限管理

===============

自定义注解一般用在日志记录,权限管理的部分,配置动态数据源一般也会用自定义注解配合AOP来完成动态切库

写了一个自定义注解配合拦截器实现权限管理的小Demo,用的是Spring Boot框架

定义权限注解

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface Authority {

String value() default “admin”;

}

增加拦截器

public class AuthorityInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {

HandlerMethod handlerMethod = (HandlerMethod) handler;

Method method = handlerMethod.getMethod();

Authority authority = method.getAnnotation(Authority.class);

if (authority == null) {

// 如果注解为null, 说明不需要拦截, 直接放过

return true;

}

// 这里为了方便直接传递了参数

// 一般的做法是用户第一次登录,将信息放到session中

// 以后每次操作时从request中获取session,从session中获取用户信息

// 然后根据用户信息从数据库中查权限信息

String userAuthority = httpServletRequest.getParameter(“userAuthority”);

if (!userAuthority.equals(“admin”)) {

// 脱离了Spring MVC的返回流程,重新编码

httpServletResponse.setCharacterEncoding(“utf-8”);

httpServletResponse.set

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

开源分享完整内容戳这里

ContentType(“application/json;charset=UTF-8”);

PrintWriter out = httpServletResponse.getWriter();

out.print(“没有权限”);

out.flush();

out.close();

return false;

}

return true;

}

@Override

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}

}

配置拦截器

@Configuration

public class WebConfig extends WebMvcConfigurerAdapter {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new AuthorityInterceptor()).addPathPatterns("/**");

}

}

测试Controller

@RestController

public class UserController {

// 这个是为了测试没有注解时,是否会拦截

@RequestMapping(value = “login”, method = RequestMethod.GET)

public Map login() {

Map<String, String> map = new HashMap<>();

map.put(“msg”, “login success”);

return map;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要定义一个注解 @RequiresPermissions,用于标记需要权限控制的方法。代码如下: ``` @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface RequiresPermissions { String[] value(); } ``` 然后,我们需要定义一个切面类,用于拦截被 @RequiresPermissions 标记的方法,并进行权限控制的逻辑。代码如下: ``` @Component @Aspect public class PermissionAspect { @Autowired private PermissionService permissionService; @Pointcut("@annotation(com.example.demo.annotation.RequiresPermissions)") public void requiresPermissionsPointcut() {} @Around("requiresPermissionsPointcut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { // 获取当前用户信息 User currentUser = UserContext.getCurrentUser(); // 获取方法上的权限标记 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); RequiresPermissions annotation = signature.getMethod().getAnnotation(RequiresPermissions.class); String[] permissions = annotation.value(); // 校验权限 boolean hasPermission = permissionService.checkPermissions(currentUser, permissions); if (!hasPermission) { throw new UnauthorizedException("没有访问权限"); } // 执行原方法 return joinPoint.proceed(); } } ``` 在上述代码中,我们通过 @Pointcut 注解定义了一个切点,用于匹配被 @RequiresPermissions 标记的方法。然后,在 @Around 注解的方法中,我们获取了当前用户信息,以及方法上的权限标记。接着,我们调用 PermissionService 的 checkPermissions 方法,校验当前用户是否拥有对应的权限。如果权限校验失败,我们抛出 UnauthorizedException 异常,表示没有访问权限。否则,我们执行原方法,并返回执行结果。 最后,我们定义一个 PermissionService 接口,用于查询用户权限信息。具体实现可以根据实际情况进行编写。代码如下: ``` public interface PermissionService { /** * 校验用户是否拥有指定的权限 * * @param user 当前用户 * @param permissions 权限列表 * @return 是否拥有指定权限 */ boolean checkPermissions(User user, String[] permissions); } ``` 综上,我们通过 Spring AOP 和自定义注解,模拟实现Shiro 框架权限控制功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值