正文
简介【自定义权限控制】
一、基于角色的权限访问控制,简称RBAC#
其基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。----来自百度
现在权限控制的组件有很多,比如:shiro、Spring的Spring-Security 组件,都是属于权限控制的,控制我们是否能够操作特定的接口。
二、自己设计的权限访问控制#
首先设计自己的注解:
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface AccessLimit { /** * 两次点击间隔时间 默认时间1000ms 单位ms * * @return */ long interval() default 1000L; /** * 是否启用限流防刷的操作 * * @return */ boolean isEnableClickLimit() default true; /** * 是否需要进行登录 * * @return */ boolean isLogIn() default true; /** * 冻结的账户是否可以进行通过 必须是 isLogIn 为true的情况下才有效 * * @return */ boolean freezeUserCanAccess() default false; /** * 该接口是否可用 也可以说接口是否可达 * * @return */ boolean enable() default true; /** * 验证码是否需要进行验证 * * @return */ boolean isVerifyCode() default false; /** * 接口的用户角色 大于等于最低的角色才能进行访问到我们的具体的请求 * * @return */ UserRole minUserRole() default UserRole.NORMAL_USER; /** * 接口名称 必须填写 日志的操作 * * @return */ String interfaceName() default ""; /** * 当前的注解是否有效 * * @return */ boolean isAnnotationEnable() default true; /** * 是否部门领导人访问 * 归结到了我们的最小角色值的访问了 * * @return * @see AccessLimit#minUserRole() */ @Deprecated boolean isOnlyDepartLeaderAccess() default false; }
三、系统角色设定#
/* 系统角色的基本操作 start */ enum UserRole { //超级管理员的权限 SUPER_ADMIN_PERMISSION(0x8), //管理员的权限 ADMIN_PERMISSION(0x4), //部门的领导者 DEPART_LEADER(0x2), NORMAL_USER(0x1); private long val; UserRole(int val) { this.val = val; } public long getPermission() { return val; } /** * 根据权限值获取我们的权限 * * @param val * @return */ UserRole getUserRole(long val) { for (UserRole userRole : values()) { if (val == userRole.getPermission()) { return userRole; } } return null; } } /* 系统角色的基本操作 end */
四、如何约束我们用户的操作呢?#
我们想的是,在执行我们的特定的方法前,执行一些约束性的代码,那么,我们就想到了我们的拦截器。
/** * Abstract adapter class for the {@link AsyncHandlerInterceptor} interface, * for simplified implementation of pre-only/post-only interceptors. * * @author Juergen Hoeller * @since 05.12.2003 */ public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
五、设计以及实现#
首先我们自己定义一个类 实现我们特定的方法
@Slf4j public class AccessLimitInterceptor extends HandlerInterceptorAdapter {
之后直接编写我们的拦截代码即可
在我们的
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; }
里面加入我们的代码逻辑
Long userRoles = userDto.getUserRoles(); UserRole userRole = methodAnnotation.minUserRole(); //我们自己的权限应当大于等于我们的接口值 我们的结构==接口才可以访问 if (userRole.getPermission() > userRoles) { //说明当前的的权限小于咱们的接口的权限 log.error("权限不够,无法操作"); ExploreWriteUtils.writeMessage(RetCodeConstant.FAIL, request, response, "权限不够,无法操作"); return false; }
至此结束