美文网首页Spring Cloud
六、API安全机制-访问控制(授权)

六、API安全机制-访问控制(授权)

作者: 紫荆秋雪_文 | 来源:发表于2020-05-13 08:05 被阅读0次

源码下载

一、API安全机制-访问控制 API安全机制.png

访问控制

访问控制算是API业务层的安全策略,为了达到你有什么权限做什么事的目的。常见的访问控制策略有ACL和RBAC

  • ACL:Access Control Lists
    • 优点:简单易用,实现容易。
    • 缺点:无法满足复杂的业务需求,不易后期维护管理
  • RBAC:Role Based Access Control
    • 优点:引入角色概念,易于后期的维护管理。
    • 缺点:相交ACL,开发相对复杂

二、ACL

  • RavenUser中添加permissions权限字段
/**
 * 负责与数据库对应
 */
@Data
@Entity
@Table(name = "t_user")
public class RavenUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @Column(unique = true)
    private String username;
    private String password;

    private String permissions;

    public RavenUserInfo builderUserInfo() {
        RavenUserInfo userInfo = new RavenUserInfo();
        BeanUtils.copyProperties(this, userInfo);
        return userInfo;
    }

    public boolean hasPermission(String method) {
        boolean result = false;
        if (StringUtils.equalsIgnoreCase("get", method)) {
            // GET请求的用户必须要有 "r" 权限
            result = StringUtils.contains(this.permissions, "r");
        }
        else {
            // GET请求的用户必须要有 "w" 权限
            result = StringUtils.contains(this.permissions, "w");
        }
        return result;
    }
}
  • ACL拦截器 RavenAclInterceptor
/**
 * ACL权限拦截器
 */
@Component
public class RavenAclInterceptor extends HandlerInterceptorAdapter {

    /**
     * 请求前缀拦截处理
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        boolean result = true;
        // 获取用户信息
        RavenUser user = (RavenUser) request.getAttribute("user");

        if (null == user) {
            // 用户未认证
            response.setContentType("text/plain");
            response.getWriter().write("need authentication");
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            result = false;
        }
        else {
            // 用户没有权限
            String method = request.getMethod();
            if (!user.hasPermission(method)) {
                response.setContentType("text/plain");
                response.getWriter().write("forbidden");
                response.setStatus(HttpStatus.FORBIDDEN.value());
                result = false;
            }
        }
        return result;
    }
}
  • 添加拦截器到链上
/**
 * 拦截器配置类
 */
@Configuration
@EnableJpaAuditing
public class RavenInterceptorConfig implements WebMvcConfigurer {

    /**
     * 审核日志拦截器
     */
    @Autowired
    private RavenAuditLogInterceptor auditLogInterceptor;
    /**
     * ACL权限拦截器
     */
    @Autowired
    private RavenAclInterceptor aclInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * registry.addInterceptor(this.auditLogInterceptor).addPathPatterns("/user");
         * 拦截器指定拦截的url
         *
         * 拦截器的添加顺序决定了拦截的先后顺序
         */
        registry.addInterceptor(this.auditLogInterceptor);
        registry.addInterceptor(this.aclInterceptor);
    }
}
  • 给用户Raven分配r权限 GET方法r权限.png
  • 给用户Raven分配w权限时 GET方法只有w权限.png
  • GET以外的其他请求也是如此

相关文章

网友评论

    本文标题:六、API安全机制-访问控制(授权)

    本文链接:https://www.haomeiwen.com/subject/agrgnhtx.html