spring 通过注解 做权限控制

注解这样写,我用的是数组的形式可以传多个

import java.lang.annotation.Documented;
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)
@Documented
public @interface ULifePermission {
    String[] value() default {};
}

实例接口如下

@ULifePermission({"2100","2101","2012","2103","2104","2015","2106","2107"})
    @RequestMapping("/page/{v}")
    @ResponseBody
    public ResultBean searchCompany(
                    @RequestParam(required = false) String name,
                    @RequestParam(required = false) String adcode,
                    @RequestParam(defaultValue="1") Integer pageIndex,
                    @RequestParam(defaultValue="20") Integer pageSize,
                    @RequestParam(required = true) String safetyId,
                    @RequestParam(required = true) String addRoleId,
                    @RequestParam(required = false) String addCompId,
                    @RequestParam(required = false) String addStoreId) {
        try {
            PageBean<SysCompanyLMvo> companys = companyService.searchCompany(name, adcode, pageIndex, pageSize, addRoleId, addCompId, addStoreId);
            
            return ResultUtil.returnResult(companys, "查询企业成功");
        }  catch (Exception e) {
            log.error(e.getMessage());
            return ResultUtil.returnResult(e);
        }
    }

过滤器如下

public class MainFilter extends HandlerInterceptorAdapter {
    private static Logger log = LoggerFactory.getLogger(MainFilter.class);

     @Resource(name = "commonService")
     private ICommonService commonService;
    
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        String path = request.getRequestURI();
        ULifePermission permissionAnnotation = ((HandlerMethod) handler).getMethod().getDeclaredAnnotation(ULifePermission.class);
        String[] permission = permissionAnnotation == null ? null : permissionAnnotation.value();
        log.debug(path + "(" + StringUtils.join(permission, "|") + ")");
        
        try {
            commonService.checkUser(request, permission);
        } catch (Exception e) {
            log.error(e.getMessage());
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write(ResultUtil.returnJson(e));
            response.getWriter().flush();
            response.getWriter().close();
            return false;
        }
        return true;
    }

}

permission就是注解中的id传,然后取request中session中的sid串做对比就行了(本人没用session用的redis)

checkUser部分代码

@Override
    public void checkUser(HttpServletRequest request, String[] permissions) {
        String token = request.getParameter("token");
        
        if (StringUtils.isEmpty(token) || RedisUtil.get(token, "addId") == null) {
            throw new SifudeException(SifudeExceptionEnum.USER_UNLOG_EXCEPTION);
        }
        
        String sids = RedisUtil.get(token, "sids") + "";

        if (permissions != null) {
            boolean flag = false;
            for (String permission : permissions) {
                if (sids.contains(permission)) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                throw new SifudeException(SifudeExceptionEnum.USER_PERMISSON_ILLEGAL_EXCEPTION);
            }
        }
    }

这样就完成了,最后是spring中对过滤器的配置

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/comp/**" />
            <bean class="com.sifude.youlife.filter.MainFilter" />
        </mvc:interceptor>
    </mvc:interceptors>

恩恩,就是这样,有什么不明白的地方欢迎留言讨论

时间: 2024-10-18 10:46:46

spring 通过注解 做权限控制的相关文章

2.4.4.3、Django用user表last_name字段做权限控制

这不是最好的方法! 数据库User表中因为是系统初始化的表,如果添加额外的字段需要修改django源文件,不利于移植,为避免带来其他问题,可以使用last_name字段做为权限控制,当然也可以用profile方法为user表添加新字段(对于user表示一对一关系,但不是在User表中),session在用户登录之后会一直存储user的信息,所以用user表中的字段在html中引用实现更简单一点(group可以在视图里使用) 如下图: 在http://10.1.1.145:8000/admin/a

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享. 需求:service层有一些方法,这些方法需要不同的权限才能访问. 实现方案:自定义一个PrivilegeInfo的注解,使用这个注解为service层中的方法进行权限配置,在aop中根据PrivilegeInfo注解的值,判断用户是否拥有访问目标方法的权限,有则访问目标方法,没有则给出提示. 关键技术:自定义注解及注解解析,spring

Spring Security 动态url权限控制(三)

一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-plus 2.2.0 mysql 数据库 maven项目 Spring Security入门学习可参考之前文章: SpringBoot集成Spring Security入门体验(一)https://blog.csdn.net/qq_38225558/article/details/101754743

struts2拦截器加自定义注解实现权限控制

https://blog.csdn.net/paul342/article/details/51436565 今天结合Java的Annotation和Struts2进行注解拦截器权限控制. 功能需求:添加.查找.删除三个功能,添加.查找功能需进行权限拦截判断,删除功能则不需进行权限拦截判断. 操作流程如下:客户未登录或登录已超时,提示"客户还没登陆或登陆已超时!!!",终止执行,然后跳转到某页面:否则继续往下执行. 以下模拟案例大概实现如上需求,接下来废话少说,直接copy代码 项目地

Spring基于注解的事务控制

准备jar包 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</gro

Spring整合Shiro做权限控制模块详细案例分析

1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId

web工程使用spring mvc+shiro进行权限控制

第1步:引入shiro相关jar包 ehcache-core-2.5.0.jar shiro-ehcache-1.2.3.jar shiro-core-1.2.3.jar shiro-web-1.2.3.jar shiro-spring-1.2.3.jar 第二步:web.xml配置 <!-- shiro的filter --> <!-- shiro过虑器,DelegatingFilterProxy通过代理模式将spring容器中的bean和filter关联起来 --> <fi

SpringMVC拦截器+Spring自定义注解实现权限验证

设计思路 主要针对需要登录后操作的接口进行校验.接入层在对外暴露接口后,网页.APP.第三方等等途径进行访问接口.用户请求首先会被SpringMVC拦截器拦截到,在拦截器里第一步就是需要校验用户的登录身份(由于是分布式系统这里采用的是userId+accessToken方式来校验),登录校验通过之后再进行用户权限校验,此时会自动拦截@AuthValidate注解的method(核心),如果权限校验失败则抛出权限不足异常,否则校验通过之后再执行具体接口并返回结果. 1.自定义注解 1 packag

spring核心配置文件_Shiro权限控制配置

<?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:aop="http://www.springframework.org/schema/a