iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringCloud下实现用户鉴权的方案
  • 718
分享到

SpringCloud下实现用户鉴权的方案

2024-04-02 19:04:59 718人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、整体架构二、实现步骤三、其它问题四、完整代码Java下常用的安全框架主要有spring Security和shiro,都可提供非常强大的功能,但学习成本较高。在微服务下鉴权多

Java下常用的安全框架主要有spring Security和shiro,都可提供非常强大的功能,但学习成本较高。在微服务下鉴权多多少少都会对服务有一定的入侵性。 为了降低依赖,减少入侵,让鉴权功能相对应用服务透明,我们采用网关拦截资源请求的方式进行鉴权。

一、整体架构

用户鉴权模块位于api GateWay服务中,所有的API资源请求都需要从此通过。

  1. 做身份认证,通过则缓存用户权限数据,不通过返回401
  2. 做用户鉴权,比对当前访问资源(URI和Method)是否在已缓存的用户权限数据中,在则转发请求给对应应用服务,不在则返回403

二、实现步骤

1. 用户登陆


public LoginUser login(String userName, String passWord){
    // 检查密码
    User user = userService.checkUser(userName, password);

    LoginUser loginUser = LoginUser.builder()
            .userName(userName)
            .realName(user.getRealName())
            .userToken(UUID.randomUUID().toString())
            .loginTime(new Date())
            .build();

    // 保存session
    session.saveSession(loginUser);

    // 查询权限
    List<Permission> permissions = permissionRepository.findByUserName(userName);
    // 保存用户权限到缓存中
    session.saveUserPermissions(userName, permissions);

    return loginUser;
}

// ...
// 缓存用户权限到Redis
public void saveUserPermissions(String userName, List<Permission> permissions) {
    String key = String.fORMat("login:permission:%s", userName);

    HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash();
    hashOperations.putAll(key, permissions.stream().collect(
            Collectors.toMap(p -> p.getMethod().concat(":").concat(p.getUri()),
                    Permission::getName, (k1, k2) -> k2)));

    if (expireTime != null) {
        redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
    }
}
  • 用户验证通过后,下发userToken,保存当前登陆信息,缓存用户授权列表
  • 缓存授权列表时,为了方便读取使用hash方式保存为list,切勿直接将数组对象保存为一个object

2. 拦截请求


@Slf4j
@Component
public class AuthorizationFilter extends AbstractGatewayFilterFactory {

    @Autowired
    private Session session;

    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {

            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response = exchange.getResponse();

            String uri = request.getURI().getPath();
            String method = request.getMethodValue();

            // 1.从AuthenticationFilter中获取userName
            String key = "X-User-Name";
            if (!request.getHeaders().containsKey(key)) {
                response.setStatusCode(httpstatus.FORBIDDEN);
                return response.setComplete();
            }

            String userName = Objects.requireNonNull(request.getHeaders().get(key)).get(0);

            // 2.验证权限
            if (!session.checkPermissions(userName, uri, method)) {
                log.info("用户:{}, 没有权限", userName);
                response.setStatusCode(HttpStatus.FORBIDDEN);
                return response.setComplete();
            }

            return chain.filter(exchange);
        };
    }
}
  • 第一步从取出身份认证模块传递的X-User-Name
  • 第二步去缓存中检查是否有相应的权限

public boolean checkPermissions(String userName, String uri, String method) {
    String key = String.format("login:permission:%s", userName);
    String hashKey = String.format("%s:%s", method, uri);

    if (redisTemplate.opsForHash().hasKey(key, hashKey)){
        return  true;
    }

    String allKey = "login:permission:all";
    // 权限列表中没有则通过
    return !redisTemplate.opsForHash().hasKey(allKey, hashKey);
}
  • 权限列表中没有则通过 主要是放过一些没有必要配置的公共资源,默认都可以访问的资源
  • login:permission:all 所有配置过的权限列表需要在程序启动时放入缓存,并需要保持数据的更新

3. 鉴权Filter配置


spring:
  cloud:
    gateway:
      routes:
        - id: cloud-user
          uri: lb://cloud-user  # 后端服务名
          predicates:
            - Path=/user/**   # 路由地址
          filters:
            - name: AuthenticationFilter  # 身份认证
            - name: AuthorizationFilter   # 用户鉴权
            - StripPrefix=1 # 去掉前缀
  • 特别注意filter的顺序,必须先做身份认证后再进行鉴权
  • 如果有较多的路由都需要配置,可使用default-filters默认Filter配置

三、其它问题

在做单元测试时,如遇到如下错误


nested exception is java.lang.NoClassDefFoundError: javax/validation/ValidationException

请升级依赖包版本:


<!--升级validation-api的版本-->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.5.Final</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

四、完整代码

代码

以上就是spring cloud下实现用户鉴权的方案的详细内容,更多关于Spring Cloud 用户鉴权的资料请关注编程网其它相关文章!

--结束END--

本文标题: SpringCloud下实现用户鉴权的方案

本文链接: https://www.lsjlt.com/news/158329.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringCloud下实现用户鉴权的方案
    目录一、整体架构二、实现步骤三、其它问题四、完整代码Java下常用的安全框架主要有Spring Security和shiro,都可提供非常强大的功能,但学习成本较高。在微服务下鉴权多...
    99+
    2024-04-02
  • SpringCloud中Gateway实现鉴权的方法
    目录一、JWT 实现微服务鉴权1 什么是微服务鉴权2.代码实现一、JWT 实现微服务鉴权 JWT一般用于实现单点登录。单点登录:如腾讯下的游戏有很多,包括lol,飞车等,在qq游戏对...
    99+
    2024-04-02
  • SpringCloud中Gateway实现鉴权的方法是什么
    本篇内容介绍了“SpringCloud中Gateway实现鉴权的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、JWT 实现微服...
    99+
    2023-06-21
  • SpringBoot结合JWT实现用户登录、注册、鉴权
    目录一、用户注册与登录二、用户鉴权用户登录、注册及鉴权是我们基本所有系统必备的,也是很核心重要的一块,这一块的安全性等都比较重要,实现的方案其实也有几种,从以前的cookie+ses...
    99+
    2023-05-19
    SpringBoot JWT 登录 注册 鉴权
  • .NET CORE 鉴权的实现示例
    目录基础信息1.什么是鉴权授权?2.传统的Session和Cookie3.存在的问题4.Token.NETCore中鉴权1.NETCore鉴权授权基本概念2.使用Cookie默认流程...
    99+
    2024-04-02
  • vue-nuxt 登录鉴权的实现
    目录介绍链接开始继续往代码中走proxy配置请求拦截处理不同前缀的接口动态路由的配置重定向及auth权限介绍 来自mentor的梳理,做个总结和记录 链接 https://aut...
    99+
    2024-04-02
  • springCloudgateWay统一鉴权的实现代码
    目录一,统一鉴权1.1 鉴权逻辑1.2 代码实现一,统一鉴权 内置的过滤器已经可以完成大部分的功能,但是对于企业开发的一些业务功能处理,还是需要我们自己 编写过滤器来实现的,那么我们...
    99+
    2024-04-02
  • springboot集成JWT实现身份认证(权鉴)的方法步骤
    目录一、什么是JWT二、JWT组成三、JWT运行原理四、springboot集成JWT一、什么是JWT JSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案...
    99+
    2023-05-16
    springboot JWT身份认证 springboot JWT身份权鉴
  • SpringCloud 客户端Ribbon负载均衡的实现方法
    目录Ribbon 介绍开启客户端负载均衡,简化 RestTemplate 调用负载均衡策略饥饿加载Ribbon 介绍 Ribbon 是 Netflix 提供的一个基于 Http 和 ...
    99+
    2024-04-02
  • 如何在SpringBoot中使用Spring-AOP实现接口鉴权
    目录面向切面编程AOP的底层原理实现AOP的相关术语相关注解以及切入点表达式实现接口鉴权1. 配置yml文件2. 读取账密配置3.编写接口鉴权方法4. 编写AOP5.编写接口测试面向...
    99+
    2024-04-02
  • SpringBoot使用Filter实现签名认证鉴权的示例代码
    情景说明         鉴权,有很多方案,如:SpringSecurity、Shiro、拦截器、过滤器等等。...
    99+
    2024-04-02
  • 基于PHP实现JWT登录鉴权的示例代码
    目录一、什么是JWT1、简介2、JWT的组成3、JWT验证流程和特点二、相关问题三、PHP实现1、引入依赖2、功能实现3、封装工具类如下一、什么是JWT 1、简介 JWT(JSON ...
    99+
    2024-04-02
  • 手把手教你用Java实现一套简单的鉴权服务
    目录前言一、何为鉴权服务二、利用servlet+jdbc实现简单的用户登录程序1.明确思路2.手把手教你实现一个简单的web登录程序三、回顾1.密码未加密裸奔2.登录信息未存储3.对...
    99+
    2024-04-02
  • 怎么使用Vuex实现Vue后台管理中的角色鉴权
    这篇文章主要介绍“怎么使用Vuex实现Vue后台管理中的角色鉴权”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Vuex实现Vue后台管理中的角色鉴权”文章能帮助大家解决问题。功能分析在常见管...
    99+
    2023-06-30
  • Go实现基于RSA加密算法的接口鉴权
    基于 RSA 加密算法的接口鉴权方案 假设接口调用者是客户端,接口提供方是服务端,则此方案存在以下规则: 客户端需要使用 RSA 算法(1024 位长度的私钥)生成公私钥...
    99+
    2024-04-02
  • SpringBoot登录用户权限拦截器的实现方法
    这篇文章主要介绍了SpringBoot登录用户权限拦截器的实现方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 创建自定义拦截器类并实现 HandlerIntercepto...
    99+
    2023-06-14
  • SpringCloud 微服务数据权限控制的实现
    目录一、 整体架构二、 实现流程三、 实现步骤1. 注解实现2. 注解使用3. 实现AuthStoreSupplier4. 实现AuthQuerySupplier5. 开启数据权限四...
    99+
    2024-04-02
  • 微服务架构下的服务调用与鉴权——某保险公司微服务平台实施案例分享
    转载本文需注明出处:微信公众号EAWorld,违者必究。引言:根据保险行业发展趋势,目前保险交易已经呈现高频化、碎片化、场景化等特点,对系统的处理能力、容量、业务连续性、需求相应速度、运维响应速度提出了更高的要求。业务模式创新重塑导致系统更...
    99+
    2023-06-05
  • 详解如何使用Vuex实现Vue后台管理中的角色鉴权
    目录前言功能分析实现思路代码实现vuex中定义user模块,存储用户信息以及用户侧边导航数据router中路由meta中新增roles 定义当前路由可以访问的所有的角色ro...
    99+
    2024-04-02
  • springboot中shiro使用自定义注解屏蔽接口鉴权实现
    目录传统做法使用自定义注解屏蔽接口鉴权拓展内容:关于spring中的派生注解传统做法 spring boot整合shiro后,如果某些接口需要屏蔽鉴权的话(比如登录)接口,我们一般会...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作