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

 更新时间:2022年08月26日 14:21:58   作者:青衣画白扇  
这篇文章主要为大家介绍了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微服务公共模块的资料请关注脚本之家其它相关文章!

相关文章

  • 一篇文章带你入门java运算符

    一篇文章带你入门java运算符

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2021-08-08
  • SpringBoot 整合 Netty 多端口监听的操作方法

    SpringBoot 整合 Netty 多端口监听的操作方法

    Netty提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架,这篇文章主要介绍了SpringBoot 整和 Netty 并监听多端口,需要的朋友可以参考下
    2023-10-10
  • Java并发编程必备之Future机制

    Java并发编程必备之Future机制

    今天给大家带来的是关于Java并发编程的相关知识,文章围绕着Java Future机制展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Sleuth(Micrometer)+ZipKin分布式链路问题小结

    Sleuth(Micrometer)+ZipKin分布式链路问题小结

    在微服务架构中,分布式链路追踪技术成为了解决系统复杂调用问题的关键,本文介绍了其他链路追踪方案,如Cat、Pinpoint和Skywalking,展示了分布式链路追踪技术的多样化,感兴趣的朋友一起看看吧
    2024-10-10
  • Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

    Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

    本文中主要陈述一种实时监听文件夹中是否有文件增加的功能,可用于实际文件上传功能的开发。本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-09-09
  • springboot+dubbo+zookeeper的简单实例详解

    springboot+dubbo+zookeeper的简单实例详解

    本文主要介绍了springboot+dubbo+zookeeper的简单实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • SpringBoot如何实现一个实时更新的进度条的示例代码

    SpringBoot如何实现一个实时更新的进度条的示例代码

    本文详细的介绍了SpringBoot如何实现一个实时更新的进度条,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • SpringBoot工程中Spring Security应用实践记录流程分析

    SpringBoot工程中Spring Security应用实践记录流程分析

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。这篇文章主要介绍了SpringBoot工程中Spring Security应用实践,需要的朋友可以参考下
    2021-09-09
  • Java java.lang.ExceptionInInitializerError 错误如何解决

    Java java.lang.ExceptionInInitializerError 错误如何解决

    这篇文章主要介绍了 Java java.lang.ExceptionInInitializerError 错误如何解决的相关资料,需要的朋友可以参考下
    2017-06-06
  • SpringBoot特点之依赖管理和自动装配(实例代码)

    SpringBoot特点之依赖管理和自动装配(实例代码)

    在使用SpringBoot的时候,会自动将Bean装配到IoC容器中,操作也很简单,今天小编给大家介绍下SpringBoot特点之依赖管理和自动装配的知识,感兴趣的朋友一起看看吧
    2022-03-03

最新评论