SpringSecurity微服务实战之公共模块详解

目录
  • 前言
  • 模块结构

前言

在项目中安全框架是必不可少的,在微服务架构中更是尤为重要,我们项目中将安全模块单独抽离了一个公共模块出来,因为在我的项目架构中 需要用到的SpringSecurity 至少有三个地方 boss服务 admin服务 user服务(saas)模式的一个微服务架构

模块结构

主要分为 base服务(提供数据,可以部署多份进行负载均衡) boss模块 admin模块 gateway模块 以及公共模块其中就包含我们今天的主角 安全模块。

我们在TokenLoginFilter中继承 AbstractAuthenticationProcessingFilter抽象类 重写 attemptAuthentication方法 在里面分别指定验证器

@Override
public Authentication attemptAuthentication(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws AuthenticationException, IOException, ServletException {
    if (!httpServletRequest.getMethod().equals("POST")) {
        throw new AuthenticationServiceException(
                "Authentication method not supported: " + httpServletRequest.getMethod());
    }
    User user = new ObjectMapper().readValue( httpServletRequest.getInputStream(), User.class);
    //处理验证码
    AbstractAuthenticationToken authRequest = null;
    switch(user.getType()) {
        //租户登录
        case "1":
            authRequest = new TenantAuthenticationToken(user.getUsername(), user.getPassword());
            break;
        //平台登录
        case "2":
            authRequest = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
            break;
    }
    setDetails(httpServletRequest, authRequest);
    return this.getAuthenticationManager().authenticate(authRequest);
}

其中TenantDetailsAuthenticationProvider租户验证器(admin) 和UsernamePasswordAuthenticationProvider 平台验证器(boss)

这里当然还可以再加其他的验证器,比如后面如果还有app的话就可以在配置一个专门来做app端权限验证的验证器。

下面我们看看令牌的续期是怎么实现的: 令牌是由jwt生成 和 redis 配合使用,每一次亲求进来检查token是否合法的同时校验一下token的剩余时间是否大于一个阈值,如果小于阈值我们进行reids 中的令牌刷新时间让用户无感知续约。

/**
 * 验证令牌有效期,相差不足20分钟,自动刷新缓存
 * @param loginUser
 * @return 令牌
 */
public void verifyToken(OnlineUserInfo loginUser,Integer type)
{
    long expireTime = loginUser.getExpireTime();
    long currentTime = System.currentTimeMillis();
     long chazhu= expireTime - currentTime;
    if (chazhu <= MILLIS_MINUTE_TEN)
    {
        refreshToken(loginUser,type);
    }
}

在访问过滤器中进行校验就可以了,这样就可以做到用户无感知令牌续约。

安全验证模块目前是再每个服务上面引入使用,后面会考虑在网关层做鉴权处理。

最后贴一下 WebSecurityConfigBugVip 这个配置类

@Configuration
@EnableWebSecurity
public class WebSecurityConfigBugVip extends WebSecurityConfigurerAdapter {
    private TokenManager tokenManager;
    @Autowired
    private TenantDetailsAuthenticationProvider userDetailsAuthenticationProvider;
    @Autowired
    private UsernamePasswordAuthenticationProvider usernamePasswordAuthenticationProvider;
    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;
    /**
     * 装配自定义的Provider
     * @param auth
     */
    @Override
    public void configure(AuthenticationManagerBuilder auth){
        auth.authenticationProvider(userDetailsAuthenticationProvider);//将我们自定义的认证器配置进来
        auth.authenticationProvider(usernamePasswordAuthenticationProvider);//默认的认证器
    }
    @Autowired
    public WebSecurityConfigBugVip(TokenManager tokenManager, RedisTemplate redisTemplate) {
        this.tokenManager = tokenManager;
        this.redisTemplate = redisTemplate;
    }
    /**
     * 配置设置
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.exceptionHandling()
                .authenticationEntryPoint(new UnauthorizedEntryPoint())
                .and().csrf().disable()
                .addFilterAt(tokenLoginFilter(), UsernamePasswordAuthenticationFilter.class)
                .authorizeRequests()//配置需要放行的请求
                .antMatchers("/swagger-ui.html/**","/v2/**","/webjars/**","/swagger-resources/**","/boss/verifi/getCode","/boss/verifi/checkVrrifyCode","/boss/sysuser/write","/boss/sysuser/read").permitAll()
                .anyRequest().authenticated()
                .and().logout().logoutUrl("/boss/acl/logout")
                .and().logout().logoutUrl("/admin/acl/logout")
                .addLogoutHandler(new TokenLogoutHandler(tokenManager, redisTemplate)).and()
                .addFilter(new TokenAuthenticationFilter(authenticationManager(), tokenManager, redisTemplate)).httpBasic();//设置访问过滤器
    }
    /**
    *token过滤器
    */
    @Bean
    public TokenLoginFilter tokenLoginFilter() {
        TokenLoginFilter filter = new TokenLoginFilter();
        filter.setAuthenticationManager(authenticationManager);
        return filter;
    }
    /**
     * 处理注入 AuthenticationManager失败问题
     * @return
     * @throws Exception
     */
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

以上就是SpringSecurity微服务实战之公共模块详解的详细内容,更多关于SpringSecurity微服务公共模块的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringSecurity框架简介及与shiro特点对比

    目录 一.SpringSecurity框架简介 二.比较一下shiro与SpringSecurity 2.1.用户量 2.2.使用的方便程度 2.3.社区支持 2.4.功能丰富性 三.总结 一. SpringSecurity 框架简介 官网:https://spring.io/projects/spring-security Spring Security 是强大的,且容易定制的,基于Spring开发的实现认证登录与资源授权的应用安全框架. SpringSecurity 的核心功能: Authe

  • Java SpringSecurity+JWT实现登录认证

    目录 整合步骤 实现原理 目录结构 做了哪些变化 前言: 学习过我的mall项目的应该知道,mall-admin模块是使用SpringSecurity+JWT来实现登录认证的,而mall-portal模块是使用的SpringSecurity基于Session的默认机制来实现登陆认证的.很多小伙伴都找不到mall-portal的登录接口,最近我把这两个模块的登录认证给统一了,都使用SpringSecurity+JWT的形式实现.主要是通过把登录认证的通用逻辑抽取到了mall-security模块来

  • mall整合SpringSecurity及JWT认证授权实战下

    目录 摘要 登录注册功能实现 添加UmsAdminController类 添加UmsAdminService接口 添加UmsAdminServiceImpl类 修改Swagger的配置 给PmsBrandController接口中的方法添加访问权限 认证与授权流程演示 运行项目,访问API 未登录前访问接口 登录后访问接口 访问需要权限的接口 改用其他有权限的帐号登录 摘要 接上一篇,controller和service层的代码实现及登录授权流程演示. 登录注册功能实现 添加UmsAdminCo

  • SpringBoot整合SpringSecurityOauth2实现鉴权动态权限问题

    目录 写在前面 准备 效果展示 实现 写在前面 思考:为什么需要鉴权呢? 系统开发好上线后,API接口会暴露在互联网上会存在一定的安全风险,例如:爬虫.恶意访问等.因此,我们需要对非开放API接口进行用户鉴权,鉴权通过之后再允许调用. 准备 spring-boot:2.1.4.RELEASE spring-security-oauth2:2.3.3.RELEASE(如果要使用源码,不要随意改动这个版本号,因为2.4往上的写法不一样了) mysql:5.7 效果展示 这边只用了postman做测试

  • springsecurity 企业微信登入的实现示例

    背景 后台系统需要接入 企业微信登入,满足企业员工快速登入系统 流程图 简单代码说明 自定义一套 springsecurity 认证逻辑 主要就是 根据code 获取绑定用户信息 然后返回登入 token ,和qq ,微信 等第 3方登入 一个套路 // 自定义 WeChatAuthenticationProvider public class WeChatAuthenticationProvider  implements AuthenticationProvider {     privat

  • mall整合SpringSecurity及JWT实现认证授权实战

    目录 摘要 项目使用框架介绍 SpringSecurity JWT JWT的组成 JWT实例 JWT实现认证和授权的原理 Hutool 项目使用表说明 整合SpringSecurity及JWT 在pom.xml中添加项目依赖 添加JWT token的工具类 添加SpringSecurity的配置类 相关依赖及方法说明 添加RestfulAccessDeniedHandler 添加RestAuthenticationEntryPoint 添加AdminUserDetails 添加JwtAuthen

  • SpringSecurity微服务实战之公共模块详解

    目录 前言 模块结构 前言 在项目中安全框架是必不可少的,在微服务架构中更是尤为重要,我们项目中将安全模块单独抽离了一个公共模块出来,因为在我的项目架构中 需要用到的SpringSecurity 至少有三个地方 boss服务 admin服务 user服务(saas)模式的一个微服务架构 模块结构 主要分为 base服务(提供数据,可以部署多份进行负载均衡) boss模块 admin模块 gateway模块 以及公共模块其中就包含我们今天的主角 安全模块. 我们在TokenLoginFilter中

  • Java微服务实战项目尚融宝接口创建详解

    目录 需求 一.创建父工程srb 二.创建模块guigu-common 1.创建Maven模块 2.配置pom 三.创建模块service-base 1.创建Maven模块 2.配置pom 四.创建模块service-core 1.创建Maven模块 2.配置pom 五.代码生成器 1.创建数据库 2.创建代码生成器 六.启动应用程序 1.创建application.yml 2.创建SpringBoot配置文件 3.创建SpringBoot启动类 需求 积分等级CRUD列表和表单 一.创建父工程

  • 解析docker妙用SpringBoot构建微服务实战记录

    它是啥? Spring Boot 是 Spring 开源组织的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手. 为啥用它? 五大优点: 1.起步依赖 官方为我们整合了大量的起步依赖,简化了我们搭建项目的工作,同时,起步依赖提供了可靠的依赖管理,降低了项目引入问题版本和依赖冲突的风险. 2. 自动配置 开启组件扫描和自动配置. 通过exclude参数关闭特定 的自动配置. 3. 应用监控 Spring Bo

  • go zero微服务实战系服务拆分

    目录 微服务概述 服务划分 BFF层 工程结构 代码初始化 结束语 微服务概述 微服务架构是一种架构风格,它将一个大的系统构建为多个微服务的集合,这些微服务是围绕业务功能构建的,服务关注单一的业务功能,这些服务具有以下特点: 高度可维护和可测试 松散的耦合 可独立部署 围绕业务功能进行构建 由不同的小团队进行维护 微服务架构能够快速.频繁.可靠地交付大型.复杂的应用程序,通过业务拆分实现服务组件化,使用组件进行组合从而快速开发系统. 服务划分 我们首先进行微服务的划分,在实际的项目开发中,我们通

  • go zero微服务实战处理每秒上万次的下单请求

    目录 引言 处理热点数据 优化 限制 隔离 流量削峰 如何保证消息只被消费一次 代码实现 结束语 引言 在前几篇的文章中,我们花了很大的篇幅介绍如何利用缓存优化系统的读性能,究其原因在于我们的产品大多是一个读多写少的场景,尤其是在产品的初期,可能多数的用户只是过来查看商品,真正下单的用户非常少. 但随着业务的发展,我们就会遇到一些高并发写请求的场景,秒杀抢购就是最典型的高并发写场景.在秒杀抢购开始后用户就会疯狂的刷新页面让自己尽早的看到商品,所以秒杀场景同时也是高并发读场景.那么应对高并发读写场

  • go zero微服务实战性能优化极致秒杀

    目录 引言 批量数据聚合 降低消息的消费延迟 怎么保证不会超卖 结束语 引言 上一篇文章中引入了消息队列对秒杀流量做削峰的处理,我们使用的是Kafka,看起来似乎工作的不错,但其实还是有很多隐患存在,如果这些隐患不优化处理掉,那么秒杀抢购活动开始后可能会出现消息堆积.消费延迟.数据不一致.甚至服务崩溃等问题,那么后果可想而知.本篇文章我们就一起来把这些隐患解决掉. 批量数据聚合 在SeckillOrder这个方法中,每来一次秒杀抢购请求都往往Kafka中发送一条消息.假如这个时候有一千万的用户同

  • Python常用内置模块之xml模块(详解)

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观.它被设计用来传输和存储数据,其焦点是数据的内容.那么Python是如何处理XML语言文件的呢?下面一起来看看Python常用内置模块之xml模块吧. 本文主要学习的ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型.在使用ElementTre

  • 基于Django contrib Comments 评论模块(详解)

    老版本的Django中自带一个评论框架.但是从1.6版本后,该框架独立出去了,也就是本文的评论插件. 这个插件可给models附加评论,因此常被用于为博客文章.图片.书籍章节或其它任何东西添加评论. 一.快速入门 快速使用步骤: 安装包:pip install django-contrib-comments 在django的settings中的INSTALLED_APPS处添加'django.contrib.sites'进行app注册,并设置SITE_ID值. 在django的settings中

  • 基于Vue的ajax公共方法(详解)

    为了减少代码的冗余,决定抽离出请求ajax的公共方法,供同事们使用. 我使用了ES6语法,编写了这个方法. /** * @param type 请求类型,分为POST/GET * @param url 请求url * @param contentType * @param headers * @param data * @returns {Promise<any>} */ ajaxData: function (type, url, contentType, headers, data) {

  • Python命令行解析模块详解

    本文研究的主要是Python命令行解析模块的相关内容,具体如下. Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块.下面就解读下这两种解析器. getopt模块 这个模块可以帮助脚本解析命令行参数,一般是sys.argv[1:].它遵循着Unix的getopt()函数相同的约定(用-/--指定命令参数).这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError). 这里重

随机推荐