Java 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/**”区域时,我想从用户处撤

我有以下Spring安全配置:

<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"/>