权限校验—接口检验

这篇具有很好参考价值的文章主要介绍了权限校验—接口检验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景介绍

最近项目中要实现根据不同用户去划分不同的角色,而不同角色具备调用不同接口的权限这个功能。用户在调用接口时需要校验用户是否具有权限访问接口,防止外界恶意调用随意篡改

二、思路&方案

为什么要进行接口鉴权?

  1. 接口鉴权可以提供对接口访问的监控和追踪功能。通过记录和审计用户对接口的访问情况,可以及时发现异常行为和安全威胁,并采取相应的措施进行应对。
  2. 通过接口鉴权,可以限制对敏感数据的访问。只有具有相应权限的用户或应用程序才能获取敏感数据,从而保护数据的机密性和完整性。
  3. 接口鉴权可以实现对接口的细粒度访问控制。根据用户的身份、角色、权限等级等,可以控制用户对接口的不同操作和功能的访问权限,确保只有有权用户可以执行相应的操作。

接口鉴权是保证系统安全、数据保护和访问控制的重要机制,防止未经授权的访问、滥用和数据泄露,提高系统的安全性和可靠性。

@PerAuthorizre权限注解

权限校验—接口检验,java,Spring Security,接口鉴权

作用:方法前拦截判断是否具备权限,用来控制被注解标记的类或方法是否能够被调用

好处

  1. 安全性增强:只有经过授权的用户才能执行带有 @PerAuthorizr 注解的代码,从而减少了潜在的安全漏洞和攻击风险。

  2. 标记权限:通过使用 @PerAuthorizr 注解,可以明确地标记哪些代码需要特定的权限才能执行。这有助于开发人员更好地了解代码的权限需求,并确保只有具有相应权限的用户或角色可以访问该代码。

底层实现

  1. 底层实现可能会使用 AOP 技术。通过 AOP,可以在代码执行之前或之后,根据注解的参数进行权限验证和授权操作。
  2. 可能会使用拦截器或过滤器来拦截请求,并进行权限验证和授权操作。拦截器或过滤器可以在请求到达目标代码之前对请求进行预处理,包括检查用户的权限和身份验证。
  3. 可能会使用缓存机制。通过缓存用户的权限信息,可以避免频繁地进行权限查询和验证,提高系统的响应速度。

使用

@PreAuthorize("")

调用别名为ss类的hasPermi方法,并传入参数

@ss注解

作用:自定义,定义了权限校验流程

结果:返回true则鉴权成功,false则返回403说明没有权限

使用

@ss.hasPermi('system:role:list')

调用别名为ss类的hasPermi方法,并传入参数

逻辑校验流程

第一步、定义@ss类,并添加hasPermi校验方法

  1.         获取传入用户的信息
  2.         判断用户信息的权限信息集合中是否含有定义的权限

权限校验—接口检验,java,Spring Security,接口鉴权

第二步、在要鉴权的接口上添加@PreAuthorizez注解

权限校验—接口检验,java,Spring Security,接口鉴权


三、过程

NS图

权限校验—接口检验,java,Spring Security,接口鉴权

引入依赖

<!-- spring security 安全认证 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>5.5.8</version>
</dependency>

定义@ss类,并添加hasPermi校验方法

package com.example;

import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Set;

/**
 * @BelongsPackage: com.example
 * @Description: 自定义权限实现
 * @Version: 1.0
 */
@Service("ss")
public class PermissionService {
    /** 所有权限标识 */
    private static final String ALL_PERMISSION = "*:*:*";


    /**
     * 验证用户是否具备某权限
     *
     * @param permission 权限字符串
     * @return 用户是否具备某权限
     */
    public boolean hasPermi(String permission) throws Exception {
        //判断是否传入权限字符
        if ( StringUtils.isEmpty(permission))
        {
            return false;
        }
        //获取用户信息
        LoginUser loginUser = SecurityUtils.getLoginUser();
        //判断是否有用户信息,或者用户信息中是否包含权限集合
        if ( StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()))
        {
            return false;
        }
        //将权限设置到请求头中
        PermissionContextHolder.setContext(permission);
        //判断是否包含权限
        return hasPermissions(loginUser.getPermissions(), permission);
    }

    /**
     * 判断是否包含权限
     *
     * @param permissions 权限列表
     * @param permission 权限字符串
     * @return 用户是否具备某权限
     */
    private boolean hasPermissions(Set<String> permissions, String permission)
    {
        return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));
    }
}

字符串工具类

package com.example;

/**
 * @BelongsPackage: com.example
 * @Description: 字符串工具类
 * @Version: 1.0
 */
public  class StringUtils {
    /** 空字符串 */
    private static final String NULLSTR = "";

    /**
     * * 判断一个对象是否为空
     * @return true:为空 false:非空
     */
    public static boolean isNull(Object object)
    {
        return object == null;
    }

    /**
     * * 判断一个字符串是否为空串
     * @return true:为空 false:非空
     */
    public static boolean isEmpty(String str)
    {
        return isNull(str) || NULLSTR.equals(str.trim());
    }


    /**
     * 去空格
     */
    public static String trim(String str)
    {
        return (str == null ? "" : str.trim());
    }
}

权限信息

package com.example;

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

/**
 * @BelongsPackage: com.example
 * @Description: TODO
 * @Version: 1.0
 */
public class PermissionContextHolder {
    private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT";

    public static void setContext(String permission)
    {
        RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission,
                RequestAttributes.SCOPE_REQUEST);
    }

    public static String getContext()
    {
        return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES,
                RequestAttributes.SCOPE_REQUEST));
    }
}

安全服务工具类

package com.example;

import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

/**
 * @BelongsPackage: com.example
 * @Description: 安全服务工具类
 * @Version: 1.0
 */
public class SecurityUtils {
    /**
     * 获取用户
     **/
    public static LoginUser getLoginUser() throws Exception {
        try
        {
            return (LoginUser) getAuthentication().getPrincipal();
        }
        catch (Exception e)
        {
            throw new Exception("获取用户信息异常");
        }
    }

    /**
     * 获取Authentication
     */
    public static Authentication getAuthentication()
    {
        return SecurityContextHolder.getContext().getAuthentication();
    }
}

登录用户身份权限

package com.example;

import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.Set;

/**
 * @BelongsPackage: com.example
 * @Description: 登录用户身份权限
 * @Version: 1.0
 */
@Data
public class LoginUser implements UserDetails
{
    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 部门ID
     */
    private Long deptId;

    /**
     * 用户唯一标识
     */
    private String token;

    /**
     * 登录时间
     */
    private Long loginTime;

    /**
     * 过期时间
     */
    private Long expireTime;

    /**
     * 登录IP地址
     */
    private String ipaddr;

    /**
     * 登录地点
     */
    private String loginLocation;

    /**
     * 浏览器类型
     */
    private String browser;

    /**
     * 操作系统
     */
    private String os;

    /**
     * 权限列表
     */
    private Set<String> permissions;


    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return null;
    }

    @Override
    public String getUsername() {
        return null;
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }
}

四、总结

本文章对@PerAuthorizre注解结合项目具体如何进行鉴权进行了详细分析,我们在项目使用的过程中除了知道怎么用,也要知其所以然。

如果大家想要了解 spring sercurity+token安全机制是如何做的权限认证和授权,关于SpringSecurity如何集成JWT做的认证授权大家可以参考这篇博主的文章:SpringSecurity集成JWT认证框架_jwt spring security_哆木的博客-CSDN博客)文章来源地址https://www.toymoban.com/news/detail-633750.html

到了这里,关于权限校验—接口检验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Boot Admin】使用(整合Spring Security服务,添加鉴权)

    Spring Boot Admin 监控平台 背景:Spring Boot Admin 监控平台不添加鉴权就直接访问的话,是非常不安全的。所以在生产环境中使用时,需要添加鉴权,只有通过鉴权后才能监控客户端服务。本文整合Spring Security进行实现。 pom依赖 yml配置 启动类@EnableAdminServer 安全配置类:SecuritySe

    2024年02月16日
    浏览(36)
  • SpringCloud微服务整合Spring Security进行统一鉴权

    网关gateway 普通资源微服务member 鉴权微服务auth 为了做到更灵活的方法级别的鉴权操作,决定将权限控制下放到具体的普通微服务,其实并不需要多配置很多东西。网关只负责转发请求,鉴权则是由auth认证微服务来完成的。 网上很多都是在网关层面进行鉴权,但是这么做不灵

    2024年02月04日
    浏览(37)
  • ASP.NET CORE WEBAPI 登录 JWT 鉴权 ,接口权限验证

    介绍 当今Web开发中,API的使用越来越广泛,而API的安全性也变得越来越重要。其中,JWT(JSON Web Token)鉴权和授权是一种常见的解决方案。 本篇文章将会介绍JWT鉴权和授权的原理、实现方式以及注意事项。 什么是JWT? JWT是一种基于JSON格式的开放标准(RFC7519),用于在网络

    2023年04月21日
    浏览(67)
  • Spring security权限管理

    主要内容 一、Spring Security简介 1.概括 ​ Spring Security是一个高度自定义的 安全框架 。利用Spring IoC/DI和AOP功能,为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作。 ​ 使用Spring Secruity的原因有很多,但大部分都是发现了javaEE的Servlet规范或

    2024年02月03日
    浏览(37)
  • 安全框架Spring Security是什么?如何理解Spring Security的权限管理?

    大家好,我是卷心菜。本篇主要讲解Spring Security的基本介绍和架构分析,如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。 🎁 作者简介: 在校大学生一枚,Java领域新星创作者,Java、Python正在学习中,期待和大家一起学习一起进步~ 💗 个人主页:我是一棵卷心菜的

    2024年02月02日
    浏览(54)
  • Java代码瘦身,巧用 @Valid,@Validated 的分组校验和嵌套检验,实现高阶参数校验操作

            在 JavaEE 项目中, RestFull 层接收参数首先要对一些字段的格式进行校验,以防止所有查询都落到数据库,这也是一种合理的限流手段。以前基本上都是用 if...else...,这样的代码太啰嗦,除了使用策略模式进行优化,今天介绍一下校验注解@Valid,@Validated和@PathVariable,

    2024年02月04日
    浏览(46)
  • 13.Spring security权限管理

    13.1什么是权限管理 Spring security支持多种不同的认证方式,但是无论开发者使用哪种认证方式,都不会影响授权功能的使用,spring security很好地实现了认证和授权两大功能的解耦。 13.2Spring security权限管理策略 从技术上来说,spring security中提供的权限管理功能主要有两种类型

    2023年04月12日
    浏览(75)
  • 【Spring Security系列】一文带你了解权限框架与Spring Security核心概念

    权限框架是软件开发中用于管理 用户权限和访问控制 的工具。在企业或者我们毕设复杂的系统中,不同的用户或角色需要拥有不同的访问和操作权限,以确保系统的安全性和数据完整性。今天我们就讨论一下Java中的安全框架! 在企业的开发中,Spring Security,Shiro都是比较流

    2024年04月16日
    浏览(39)
  • 【Spring Security】使用 OncePerRequestFilter 过滤器校验登录过期、请求日志等操作

    OncePerRequestFilter 是一个过滤器,每个请求都会执行一次;一般开发中主要是做检查是否已登录、Token是否过期和授权等操作,而每个操作都是一个过滤器,下面演示一下。 检查是否登录过期过滤器 检查是否登录过期过滤器 End

    2024年02月10日
    浏览(69)
  • SpringBoot整合Spring Security实现权限控制

    要对Web资源进行保护,最好的办法莫过于Filter 要想对方法调用进行保护,最好的办法莫过于AOP。 Spring Security进行认证和鉴权的时候,就是利用的一系列的Filter来进行拦截的。 如图所示,一个请求想要访问到API就会从左到右经过蓝线框里的过滤器,其中 绿色部分是负责认证的

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包