如何在spring security中更新用户权限后立即启用权限?

Gor*_*uan 21 java spring-security

我正在使用spring-security框架.当我更新权限时,它不会立即生效.我必须退出当前用户(意味着退出),然后重新访问(意味着登录)将更新用户的权限.

在spring security中更新用户权限后立即启用权限的方法是什么?

Jan*_*ing 7

您可以像这样在AbstractSecurityInterceptor中设置alwaysReauthenticate

<bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
        <property name="alwaysReauthenticate" value="true"/>
 ...
</bean>
Run Code Online (Sandbox Code Playgroud)

当然你应该注意,因为99.9%你不需要重新认证.由于身份验证可能使用数据库或其他内容,因此性能可能会降低.但通常你有一个缓存,比如带有休眠的二级缓存,所以每次加载用户详细信息应该是一个只有内存的操作,在所有情况下权限都没有改变.


mat*_*t b 1

由于您没有在问题中提供确切的详细信息,我假设您遇到以下情况:

  1. 您正在提供 UserDetailsS​​ervice 以在用户尝试登录时加载 UserDetails
  2. 作为该服务的一部分,您正在查询数据库/DAO 以加载有关用户权限的详细信息,并根据此设置授予的权限
  3. 当您说“当我更新权限时”时,您指的是更新数据库(或您存储数据的任何内容)中的用户权限。

如果是这样,那么您所看到的是设计使然 - Spring Security 仅在用户第一次尝试登录时加载 UserDetails,然后将其存储在 Session 中。一般来说,这是有意义的,因为它避免了应用程序必须对每个请求执行有关用户详细信息的相同查询。此外,用户的权限在 99.9% 的访问中通常不会发生变化。

要更改此行为,您可能需要考虑在某处添加“刷新”命令/页面,该命令/页面将触发一些代码(您必须编写这些代码),这些代码将重新查询 UserDetailsS​​ervice 并替换 SecurityContext 中的 UserDetails。我不相信有任何内置的方法可以做到这一点。