- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的 Spring Boot 应用程序中实现“强制注销”功能(例如,在管理员禁用用户帐户后)。
我按照各种教程中指定的步骤访问 session 注册表,以便使用户的 session 过期(baeldung step 6 和 verbose version on myyurt ;还有 related SO )。
但是,在将 SessionRegistryImpl 注册为 @Bean 之后,在使用调试器时,我看到依赖注入(inject)机制中有 2 个不同的实例:
Spring Security 在登录和注销时使用一个 sessionRegistry 实例,并按预期保存主体和 session 。下面的屏幕截图是在登录后截取的 - 我在 registerNewSession() 方法中有一个断点。注意 id 和已经登录用户的 map 。
另一个 sessionRegistry 实例仅提供给我自己的 SessionManager 类,它需要 SessionRegistry 作为依赖项并调用 getAllPrincipals()。请注意 id 不同并且 map 为空(我在多次登录并截取第一个屏幕截图后调用了 getAllPrincipals())
我注册 sessionRegistry bean 的类(我删除了不必要的代码,只留下了我的自定义过滤器,以防它可能与 Springs 自动配置有关):
@EnableWebSecurity
class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public static HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
@Bean
public static SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterBefore(myFirstFilter, UsernamePasswordAuthenticationFilter.class)
.addFilterAfter(mySecondFilter, FilterSecurityInterceptor.class)
.formLogin() // skipping details
.and()
.x509() // skipping details
.and()
.logout()
.invalidateHttpSession(true)
.permitAll()
.and()
.authorizeRequests() // skipping details
.and()
.sessionManagement()
.invalidSessionUrl("/login")
.enableSessionUrlRewriting(false)
.maximumSessions(-1)
.maxSessionsPreventsLogin(false)
.sessionRegistry(sessionRegistry())
.expiredUrl("/login?expire");
}
}
我使用 sessionRegistry 依赖项的类:
@Component
class DefaultSessionManager implements SessionManager {
private final SessionRegistry sessionRegistry;
@Autowired public DefaultSessionManager(SessionRegistry sessionRegistry) {
this.sessionRegistry = sessionRegistry;
}
public void expireUserSessions(String username) {
for (Object principal : sessionRegistry.getAllPrincipals()) {
// do stuff, but won't enter because the list is empty
}
}
}
如果有帮助,我使用 Actuator/beans 端点查找 beans 设置,这就是它返回的内容
{
"bean": "defaultSessionManager",
"aliases":
[
],
"scope": "singleton",
"type": "com.foo.bar.DefaultSessionManager",
"resource": // file path
"dependencies":
[
"sessionRegistry"
]
},
{
"bean": "httpSessionEventPublisher",
"aliases":
[
],
"scope": "singleton",
"type": "org.springframework.security.web.session.HttpSessionEventPublisher",
"resource": "class path resource [com/foo/bar/SecurityConfig.class]",
"dependencies":
[
]
},
{
"bean": "sessionRegistry",
"aliases":
[
],
"scope": "singleton",
"type": "org.springframework.security.core.session.SessionRegistryImpl",
"resource": "class path resource [com/foo/bar/SecurityConfig.class]",
"dependencies":
[
]
},
如果都声明为Singleton,DI系统中怎么会有两个不同的实例呢?您对可能出现的问题有什么建议吗?
我正在使用 spring-boot-starter-parent 1.5.2.RELEASE,它使用 Spring Security 4.2.2.RELEASE。
最佳答案
问题是您的 @Bean
注释方法上的静态关键字。在您调用的配置中
.sessionRegistry(sessionRegistry())
它直接调用静态方法而不是通过 Spring 代理从应用程序上下文中获取 bean。这意味着,对于您的安全配置,您创建一个新实例而不是从应用程序上下文中获取 bean。对于非静态方法,相同调用中的直接方法调用会被 Spring 拦截,然后检查该 bean 是否已存在于应用程序上下文中,如果存在,则返回该 bean。
关于java - Spring boot session management - 为什么有两个sessionRegistry实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45885040/
我做了以下事情: 登录到我的 spring 应用程序(例如,作为用户“admin”) 停止tomcat 现在我看到 session 被序列化到 sessions.ser 文件中 我重启tomcat s
我有一个完全由 Weblogic 容器保护的 Web 应用程序。现在我必须列出当前登录的用户。我必须为此使用 Spring Security 2.0.4 在 web.xml 中我定义了必要的监听器和过
我使用 spring security3 和 spring mvc3 来构建一个 web 项目。有一个叫index.jsp的页面,会显示登录用户名和在线用户数 此屏幕的顶部。登录系统有两种方式: 从登
使用 @Autovired SessionRegistry sessionRegistry 在我的代码中,我添加了以下配置: http.sessionManagement() .max
我在 Spring Boot 应用程序中使用 Spring Security 来提供用户功能。我花了一些时间寻找问题的答案,但只为使用基于 xml 的配置的人找到了解决方案。 我的设置与此非常相似:h
我似乎找不到如何在 Struts 操作中获取对 Spring Security (V3) SessionRegistry 的引用。 我已经在我的 web.xml 文件中配置了监听器: org
有人可以提供关于如何仅使用 java 配置在 Spring Security 中获取非空 SessionRegistry 对象(没有任何 XML)的真实工作代码片段。 我正在使用 Spring Sec
在我写的http标签内: 我有以下 sas bean 在代码中我从注册表获取信息: @Autowired private SessionRegistr
我们的应用过去只有一种登录方式:用户名和密码。一旦新用户登录到应用程序,他们的 session 将出现在 Spring Security 的 SessionRegistry 中。 现在我正在 Spri
我正在使用 Hazelcast 3.4 和 Spring security 3.2.5。当我部署应用程序并尝试登录时,登录成功但抛出异常,导致错误页面。无论错误页面如何,我都已登录并且我的 sessi
问题场景: 我正在尝试使用带有 Java 配置的 Spring Security v3.2.3 来配置 session 管理,以便将 maximumSessions 设置为 1 并将 maxSessi
我正在使用 spring security 进行自定义身份验证。我没有使用任何 AuthenticationProvider,但使用 UsernamePasswordAuthenticationTok
也许应该配置 session 过期时间,或者我的代码中有错误? 我的 Controller 代码片段。即使已注销,它也会显示用户名。 @GetMapping("/") public String
我是一名优秀的程序员,十分优秀!