最大会话 1 不适用于 Spring Boot

2024-01-13

我想在我使用 spring boot 和基于 java 的配置的应用程序中仅限制单个用户的一个最大会话。我使用了 spring max session 1。但它对我不起作用。 这是我基于java的spring配置文件

package com.prcvideoplt.prc;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.core.session.SessionRegistryImpl;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import org.springframework.security.web.session.HttpSessionEventPublisher;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import com.prcvideoplt.handlers.LoginFailureHandler;
import com.prcvideoplt.handlers.LoginSuccessHandler;
import com.prcvideoplt.handlers.LogoutSuccessHandler;
import com.prcvideoplt.service.security.CompanyBasedCustomFilter;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity
@ComponentScan(basePackages = "com.prcvideoplt")
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Resource(name = "custUserDetails")
    private UserDetailsService userDetailsService;

    @Override
    @Bean
    public UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }

    @Bean(name = "passwordEncoder")
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(13);
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Configuration
    @Order(value = 1)
    public static class UserWebSecurityConfig extends WebSecurityConfigurerAdapter {

        @Resource(name = "loginSuccessHandler")
        private LoginSuccessHandler loginSuccessHandler;
        @Resource(name = "loginFailureHandler")
        private LoginFailureHandler loginFailureHandler;
        @Resource(name = "logoutSuccesshandler")
        private LogoutSuccessHandler logoutSuccesshandler;

        @Autowired
        DataSource dataSource;

        @Autowired
        UserDetailsService userDetailsService;

        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/assets/**");
        }

        @Bean
        public HttpSessionEventPublisher httpSessionEventPublisher() {
            return new HttpSessionEventPublisher();
        }

        @Bean
        public CompanyBasedCustomFilter authenticationFilter() throws Exception {
            CompanyBasedCustomFilter authFilter = new CompanyBasedCustomFilter();
            authFilter.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/authenticate", "POST"));
            authFilter.setAuthenticationSuccessHandler(loginSuccessHandler);
            authFilter.setAuthenticationFailureHandler(loginFailureHandler);
            authFilter.setAuthenticationManager(authenticationManager());
            return authFilter;
        }

        @Override
        @Bean(name = "authenticationManager")
        protected AuthenticationManager authenticationManager() throws Exception {
            return super.authenticationManager();
        }

        @Bean
        public PersistentTokenRepository persistentTokenRepository() {
            JdbcTokenRepositoryImpl tokenRepositoryImpl = new JdbcTokenRepositoryImpl();
            tokenRepositoryImpl.setDataSource(dataSource);
            return tokenRepositoryImpl;
        }

        @Bean
        public SessionRegistry sessionRegistry() {
            SessionRegistry sessionRegistry = new SessionRegistryImpl();
            return sessionRegistry;
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable().authorizeRequests().antMatchers(new String[]{"/user/**"}).hasRole("USER").antMatchers("/admin/**")
                    .hasAnyRole(new String[]{"ADMIN", "SUB_ADMIN"}).antMatchers(new String[]{"/**"}).permitAll().anyRequest().authenticated().and()
                    .formLogin().loginPage("/check-url-pattern").loginProcessingUrl("/authenticate").usernameParameter("username")
                    .passwordParameter("password").permitAll().and().addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class)
                    .rememberMe().key("rem-me-key").rememberMeParameter("remember-me").rememberMeCookieName("my-remember-me")
                    .tokenRepository(persistentTokenRepository()).tokenValiditySeconds(86400).and().logout().logoutUrl("/invalidate")
                    .logoutSuccessHandler(logoutSuccesshandler).invalidateHttpSession(true).and().headers().frameOptions().sameOrigin().and()
                    .sessionManagement().maximumSessions(1).expiredUrl("/expired").maxSessionsPreventsLogin(true).sessionRegistry(sessionRegistry());

        }
    }
}

请提出一个解决方案。


你必须删除

 @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大会话 1 不适用于 Spring Boot 的相关文章

  • JavaFX 2.0 FXML 子窗口

    经过多次搜索我发现了这个问题如何创建 javafx 2 0 应用程序 MDI https stackoverflow com questions 10915388 how to create a javafx 2 0 application
  • Java:线程“主”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:

    我是初学者 谁能帮我弄清楚我们在做什么 我正在尝试读取字符串并将字符串的每个字符存储在数组中 import java util Scanner public class CoreMainDigitExtractor static Scann
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • 正则表达式在 Velocity 模板中不起作用

    我在 Test java 中尝试过这个 String regex lt s br s s gt String test1 lt br gt System out println test replaceAll regex 但是当我在速度模板
  • 如何使用 Spring Boot 传输音频

    我想让用户能够播放声音 我的实现在 Firefox 上运行良好 在 Safari 上 不播放声音 我验证了音频控制可以在 Safari 中与其他网站一起使用 所以 我认为我必须更改控制器中的某些内容 控制器 RequestMapping v
  • LocalDate 减去 period 得到错误的结果

    LocalDate减去一个Period 如 28年1个月27天 得到错误的结果 但减去一个Period 只有天单位 如 10282 天 得到正确的结果 有什么需要注意的吗 public static void main String arg
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Java:一个函数有多种返回类型...可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public String fetchValueAsString String key public DateTime fetchValueAsDateTime String key 我想要类似的东西
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator
  • HTTPS 请求仅在 iOS、Ionic 2 上失败

    我有一个Ionic 2调用一个应用程序Spring Boot用于向其他设备发送推送通知的 API API 配置为 HTTPS The API POST请求适用于一切except iOS 我在服务器上的 SSL 证书是自签名的 也许就是这样
  • java.lang.ClassCastException:com.sun.proxy.$Proxy8 无法转换为 org.openqa.selenium.internal.WrapsDriver

    我有以下切入点和 AspectJ 中给出的建议 Pointcut call org openqa selenium WebElement sendKeys public void onWebElementAction After onWeb
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter

随机推荐

  • 代码高尔夫:钻石图案

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 挑战 根据输入输出菱形图案的字符数最短代码 输入由 3 个正数组成 分别代表菱形的大小和网格的
  • 如何复制一行数据,并以偏移量粘贴它

    我正在处理一个 Excel 2010 工作表 其中包含一些医生的姓名及其地址 但经常有 2 个姓名相同但地址不同 在这种情况下 我想将地址信息复制到与名字相同的行 但偏移量为 4 列 这是我想出的代码 Sub OraganizadorEnd
  • bash read -d '' 的作用是什么?

    a 是什么意思 d 在 bash 读取命令中做什么 该示例直接来自以前的SO https stackoverflow com questions 15429330 how to specify a multi line shell vari
  • 在 Python 中如何使用函数(回调)作为另一个函数的参数?

    假设我有一些代码 例如 def myfunc anotherfunc extraArgs somehow call anotherfunc here passing it the extraArgs pass 我想传递另一个现有函数作为an
  • 将 List 从 actionlink 传递到控制器方法

    在我的控制器中我有这个 ViewBag lstIWantToSend lstApps Select x gt x ID ToList creates a List
  • SQL Server 中将signed int 转换为字符串ip 地址

    我正在从 SQL Server 数据库检索一个带符号的 int 并且需要将其转换为 正常 外观的点字符串以向用户显示 谷歌搜索 我发现了这段代码 SELECT dbo IPADDRESS IPADDRESS CAST ROUND cast
  • 为什么 NHibernate.Cache.HashtableCacheProvider 不适合生产使用?

    The NHibernate 文档 http nhforge org doc nh en index html performance cache和书NHibernate 实际应用 https rads stackoverflow com
  • 继承默认构造函数在 gcc 中失败,但在 clang 中有效,哪个有 bug?

    举这个简单的例子 struct Base Base Base defined by the compiler struct Derived Base using Base Base Should inherit Base Base Deri
  • 为什么 Windows Azure 诊断不能可靠地记录日志?

    我们在使 Windows Azure 诊断可靠地记录日志时遇到问题 这似乎是偶然的 我们不明白为什么 这是我们的代码 有时有效 有时无效 public class WorkerRole RoleEntryPoint public overr
  • android ViewPager可定制

    我需要实现一个滚动视图 如下所示 也就是说 在 空闲 状态下 图像 1 以全尺寸可见 而图像 2 部分可见 从而向用户提供他可以滚动内容的线索 滚动后 滚动视图不得停留在中间状态 并且滚动必须完成 就像 iOS 的滚动视图在 启用分页 打开
  • Terraform 可选 jsonencode 属性

    好的 获取以下 terraform 片段 variable my var1 type string default null variable my var2 type string default null output my out v
  • HP Fortify 路径操作验证规则

    我正在通过 Hp Fortify 运行代码 并有一些路径操纵的发现 我了解它的背景并试图解决 我没有遍历从数据库查询某些路径值来存储输出文件 日志 导出数据等 的所有位置 而是尝试将其集中化 因此 我不想让 File WriteAllTex
  • 在 Android 上强制正确的 CSS3 转换百分比解释

    tl dr 获取下面链接中演示的机制 以在 Android Chrome 和默认浏览器上使用 GPU 加速 UPDATE 2 2014 01 13 13 25 30Z 根据bref it https stackoverflow com us
  • 引用 JSON 树结构的分支的最佳方法是什么?

    所以我有一个 JSON 文件 它被解析为 Javascript 中的对象 我知道你在想什么 幸运的家伙 JSON 本质上是一个大树形式的流程图 这是我想要实现的目标的一个小样本 tree options options name targe
  • 使用不同搜索空间大小的不同 lucene 搜索结果

    我有一个使用 lucene 进行搜索的应用程序 搜索空间有数千个 在这数千个搜索中 我只得到了一些结果 大约 20 个 这是正常的并且是预期的 然而 当我将搜索空间减少到只有那 20 个条目时 即我只对这 20 个条目建立索引并忽略其他所有
  • 过滤掉 SELECT 中重复的后续记录

    PostgreSQL 8 4 表 trackingMessages 存储移动设备 tm nl mobileid 和固定设备 tm nl fixedId 之间的跟踪事件 CREATE TABLE trackingMessages tm id
  • 将 XML 数据(键/值对)加载到数据结构中

    我有一个 XML 数据源 其中包含键 值对列表 我正在寻找一种简单的方法将相同的数据加载到数组或其他一些数据结构中 以便我可以轻松查找数据 我可以通过几次点击将其绑定到 GridView 但我无法找到一种直接的方法将其加载到非 UI 控件中
  • 如何防止Maven访问远程仓库?

    我怎样才能强制Maven仅使用我的本地存储库和 Intranet 上的单个特定存储库并且不从互联网下载任何东西 即使我的 POM 都指定了单个公司的内部存储库 maven 也会从 libs 的 POM 文件中访问互联网存储库来获取依赖项 在
  • WPF 中的编号列表

    我正在尝试在基于 WPF 的 UI 中创建一个编号列表 带有子列表 我知道BulletDecorator用于创建项目符号列表 我希望编号列表可能有类似的东西 我希望能够实现类似的目标 项目清单 项目清单 a 子列表项 b 子列表项 项目清单
  • 最大会话 1 不适用于 Spring Boot

    我想在我使用 spring boot 和基于 java 的配置的应用程序中仅限制单个用户的一个最大会话 我使用了 spring max session 1 但它对我不起作用 这是我基于java的spring配置文件 package com