如何自定义注解实现简单的权限控制
2017-08-27 20:45
543 查看
为什么需要权限控制?
当一个系统建成之后,需要适当的做一些权限控制,使得某些非法用户不能随意更改系统,而允许某些特权用户可以操作系统.一般系统如何实现权限控制?
一般系统如果权限较为复杂,可能需要借助一些权限控制框架,例如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(); } }
然后将拦截器配置一下就好
相关文章推荐
- 自定义注解+Struts2拦截器实现简单权限控制
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- 细粒度 自定义注解 权限控制具体实现
- 自定义注解+拦截器实现权限控制
- spring AOP + 自定义注解实现权限控制小例子
- 自定义注解+拦截器实现权限控制
- springAOP与自定义注解实现细粒度权限控制管理
- spring AOP + 自定义注解实现权限控制小例子
- 二十七、权限控制的自定义注解实现方式
- 利用struts2拦截器加自定义注解实现权限控制
- spring AOP + 自定义注解实现权限控制小例子
- Struts1运用Java注解实现简单的权限控制
- SpringBoot 自定义注解实现权限控制
- 【转】sql 如何设计数据库表实现完整的RBAC(基于角色权限控制)
- ASP.NET MVC 中如何实现基于角色的权限控制
- 通用数据级权限控制解决方案的实现(一):Cube中的自定义DLL
- 一款二级菜单和使用自定义标签实现简单权限控制
- AOP/CGLIB学习:实现简单的注解权限系统(Annotation+拦截器)
- CodeIgniter通过hook的方式实现简单的权限控制
- 如何实现最精细的权限控制?(暂缺)