【自己设计权限控制】【网站的权限控制】【限制用户访问级别高的接口】

简介: 【自己设计权限控制】【网站的权限控制】【限制用户访问级别高的接口】

正文


简介【自定义权限控制】


一、基于角色的权限访问控制,简称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;
}


至此结束

相关文章
|
4月前
|
安全 Java 关系型数据库
实现权限控制的方法
实现权限控制的方法
|
5月前
|
存储 安全 数据库
管理端开发如何快速理解并实现权限控制总结
管理端开发如何快速理解并实现权限控制总结
|
11月前
|
数据安全/隐私保护 Python
rootwrap 权限控制
rootwrap 权限控制
62 0
|
数据安全/隐私保护
15-企业权限管理-方法级别权限控制
15-企业权限管理-方法级别权限控制
15-企业权限管理-方法级别权限控制
|
存储 设计模式 缓存
权限管理系统,可以这么设计
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。对权限做管理的系统,就是权限管理系统。
|
SQL BI 数据安全/隐私保护
RBAC、控制权限设计、权限表设计 基于角色权限控制和基于资源权限控制的区别优劣
RBAC、控制权限设计、权限表设计 基于角色权限控制和基于资源权限控制的区别优劣
578 0
RBAC、控制权限设计、权限表设计 基于角色权限控制和基于资源权限控制的区别优劣
|
PHP 数据库 数据安全/隐私保护
简单权限管理设计
这套权限管理是配合Zend Framework设计的,用在其他地方的时候可以做些修改。
简单权限管理设计