Java Spring安全撤销权限
我有以下Spring安全配置:Java Spring安全撤销权限,java,spring,jakarta-ee,spring-mvc,spring-security,Java,Spring,Jakarta Ee,Spring Mvc,Spring Security,我有以下Spring安全配置: <security:http> <security:intercept-url pattern="/**" access="ROLE_USER"/> <security:intercept-url pattern="/auth/**" access="ROLE_ADMIN"/> .... </security:http> .... 当用户导航出“/auth/**”区域时,我想从用户处撤
<security:http>
<security:intercept-url pattern="/**" access="ROLE_USER"/>
<security:intercept-url pattern="/auth/**" access="ROLE_ADMIN"/>
....
</security:http>
....
当用户导航出“/auth/**”区域时,我想从用户处撤销“角色\管理”权限
如何实现这样的功能?除了/auth/**可以撤销用户的权限之外,我可以在所有URL上设置某种过滤器吗
我可以“动态”撤销它吗?您应该进行自定义链配置并在其中插入自定义过滤器。它将是这样的: Spring安全配置文件:
<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<security:filter-chain-map path-type="ant">
<security:filter-chain pattern="/**" filters="
securityContextPersistenceFilter,
revokeAuthRoleFilter,
.. all the other filters here
filterSecurityInterceptor"
/>
</security:filter-chain-map>
</bean>
<!--Stores SecurityContext between requests and clears SecutityContextHolder-->
<bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>
<bean id="revokeAuthRoleFilter" class="com.package.RevokeAuthRoleFilter">
<!--This filter is called when user is authenticated. It grants access to resources-->
<bean id="filterSecurityInterceptor"
class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="accessDecisionManager"/>
<property name="securityMetadataSource">
<security:filter-security-metadata-source use-expressions="true">
<security:intercept-url pattern='auth/**/' access="hasAnyRole('ROLE_ADMIN')"/>
<security:intercept-url pattern='/**' access="hasAnyRole('ROLE_USER')"/>
</security:filter-security-metadata-source>
</property>
</bean>
当用户导航出“/auth/**”区域时,我想从用户处撤销“角色\管理”权限
如何实现这样的功能?除了/auth/**可以撤销用户的权限之外,我可以在所有URL上设置某种过滤器吗
我可以“即时”撤销它吗
我认为您误解了拦截url
元素的含义:
<security:intercept-url pattern="/auth/**" access="ROLE_ADMIN"/>
这并不是说“在/auth/**
树中授予用户角色\u ADMIN
”。它说,“拥有角色的用户可以访问/auth/**
树中的页面”
至少可以说,用户角色的变化取决于他/她所看到的东西,这种想法很奇怪
我试图做的是在用户每次点击“/auth/**”psth时验证用户名和密码
好吧,这是一个合理的要求。(不过,作为一个假想的用户,我会发现仅仅在网站上导航就会导致我注销,这是一件神秘和/或恼人的事情。)
但是我认为你不应该通过动态地改变用户的角色来做到这一点。如果您这样做,您可能会得到“权限被拒绝”的响应,而不是重定向到登录页面
您真正需要做的是将它们恢复到“未登录”状态。但即使这样也可能有点棘手。如果/auth/**
树中的页面具有指向样式表或脚本文件的链接,那么当浏览器获取这些链接时,安全过滤器可能会认为用户已导航出/auth/**
树并将其注销。为什么要这样做?这是一件非常不寻常的事情,对我来说听起来像是一种反模式。角色应该是全局的,应用程序应该相应地进行操作。请提供有关您的用例的更多数据。同意。角色是用户安全上下文的一部分,只能通过1)管理员更新或2)用户配置文件中的永久更改(如删除产品)来更新。为什么要这样做?感谢您的反馈,我正在尝试的是在用户每次点击“/auth/**”psth时验证用户名和密码。因此,身份验证应该执行两次,一次用于“/”并且每次/auth/**点击。所以你能帮我找到另一种方法吗?我认为只有使用定制的Spring安全过滤器才有可能。不要试图用标准的Spring安全特性来模拟这种行为,实现您自己的。
<security:intercept-url pattern="/auth/**" access="ROLE_ADMIN"/>