如何自定义注解实现简单的权限控制

为什么需要权限控制?

当一个系统建成之后,需要适当的做一些权限控制,使得某些非法用户不能随意更改系统,而允许某些特权用户可以操作系统.

一般系统如何实现权限控制?

一般系统如果权限较为复杂,可能需要借助一些权限控制框架,例如shiro来实现权限控制,但是shiro过于重,有些系统权限控制较为简单,使用shiro有些杀鸡焉用牛刀了;一些公司的业务较多,但是权限主体相同,这种场景下,一般我们会将权限系统剥离处理,做成接口形式,统一管理各个业务之间的权限形式.

如何实现简单的权限控制?

一般的项目中都需要做一些简单的登录控制,比如有些操作需要特定的用户才能访问,而有些操作则不需要.

一般项目中我们会采用过滤器实现拦截过滤某些方法的功能,可根据拦截方法和放行的方法的比例来实现功能,
当和spring结合使用时,我们既可以使用过滤其实现,也可以通过继承HandlerInterceptorAdapter,来利用aop实现拦截方法

但是使用以上方法时,我们不能灵活控制权限更改问题,每次当权限变动都需要改动代码,业务侵入性高,而且不利于理解,
其实我们可以参考shiro的注解实现,编写一些特定的注解实现权限控制.

自定义注解实现方法拦截

本篇文章只是简单讲解下,方法拦截,做一些简单的权限控制,不做复杂的,
一些稍微复杂的权限控制,例如读取数据库中的权限信息,可以根据业务在权限拦截器中实现.

代码实战

权限注解:

package com.taoyuan.ebook.anno;

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;

import org.springframework.web.bind.annotation.Mapping;

/**
 * @author 都市桃源
 *权限自定义注解 简版,可以注解在方法和类上
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface Interception {
    //是否允许
    boolean permit() default false;

}

拦截器实现代码

package com.taoyuan.ebook.anno;

import java.io.IOException;
import java.util.Arrays;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.taoyuan.ebook.util.CookieUtil;
import com.taoyuan.ebook.util.PropertiesUtil;

public class PermissionInterceptor extends HandlerInterceptorAdapter {

    public static final String LOGIN_TOKEN;
    static {
        LOGIN_TOKEN= PropertiesUtil.getString("LOGIN_TOKEN");
    }

    public static boolean login(HttpServletResponse response, boolean ifRemember){
        CookieUtil.set(response, LOGIN_TOKEN, ifRemember);
        return true;
    }
    public static void logout(HttpServletRequest request, HttpServletResponse response){
        CookieUtil.remove(request, response, LOGIN_TOKEN);
    }
    public static boolean ifLogin(HttpServletRequest request){
        String info= CookieUtil.getValue(request, LOGIN_TOKEN);
        if (info==null || !LOGIN_IDENTITY_TOKEN.equals(info.trim())) {
            return false;
        }
        return true;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        if (!(handler instanceof HandlerMethod)) {
            return super.preHandle(request, response, handler);
        }

        if (!ifLogin(request)) {
            HandlerMethod method = (HandlerMethod)handler;
            //获取方法上的注解
            Interception methodPermission = method.getMethodAnnotation(Interception.class);
            Interception typePermission=method.getBeanType().getAnnotation(Interception.class);
            if (methodPermission!=null) {//检测注解
                if(methodPermission.permit()){
                    return true;
                }else{//优先检测方法注解,拦截
                    return handle(request, response);
                }

            }
            if (typePermission!=null) {//检测类注解
                boolean permit = typePermission.permit();
                if(typePermission.permit()){
                    return true;
                }else{//优先检测方法注解,拦截
                    return handle(request, response);
                }
            }
        }

        return super.preHandle(request, response, handler);
    }

    public boolean handle(HttpServletRequest request, HttpServletResponse response) throws IOException{
        response.sendRedirect(request.getContextPath() + "/toLogin");
        return false;
    }

}

使用

@Controller
@RequestMapping("/book")
@Interception
//注解类上,表示全部拦截@Interception
//@Interception(permit=true) 表示全部放行
public class BookControler {
    @Autowired
    BookService bookService;

//也可以注解方法上
    @Interception(permit=true)
    @RequestMapping("/getAll")
    public  @ResponseBody List<Book> getAll() throws Exception{
        return bookService.selectAll();

    }


}

然后将拦截器配置一下就好

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值