了解 RoleVoter 概念?

Understanding RoleVoter concept?

我可以在其中一个项目中看到以下配置

<bean id="myFilterSecurityInterceptor"
        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>
                <security:intercept-url pattern="/user/**" access="PERMISSION_VIEW_USER" />
                             .....
            </security:filter-security-metadata-source>
        </property>
    </bean>

    
    <bean id="accessDecisionManager"
        class="org.springframework.security.access.vote.AffirmativeBased" >
        <property name="decisionVoters">
            <list>
                <bean class="org.springframework.security.access.vote.RoleVoter" />
                <bean class="org.springframework.security.access.vote.RoleVoter">
                    <property name="rolePrefix" value="PERMISSION_"/>
                </bean>
            </list>
        </property>

问题 1 :-

我无法理解带有 class "RoleVoter" 的两个 bean 元素在这里扮演什么角色?我的意思是单一角色选民还不够吗?

问题二:-

也在一豆下
属性 name="rolePrefix" value="PERMISSION_" 有何帮助?

我对第二个问题的理解是,当用户尝试访问 URL /user/ 时,RoleVoter 会将授予的权限与值进行匹配 针对访问属性(在本例中为 PERMISSION_VIEW_USER)给出,并且它还应以“PERMISSION_”开头(作为 rolePrefix 的值给出)。 对吗?

我通过 [此链接][1] 确认了我对问题 2 的理解。别管这个了

如果你有第二个问题的解决方案,那么第一个问题就真的得到了解答。 RoleVoter 使用的 default prefixROLE_,因此它将忽略任何不匹配的属性。

添加第二个具有自定义前缀的选民意味着匹配 ROLE_PERMISSION_ 的属性将被考虑在内。不过,该行为与前缀无关,因此除非有其他原因在您的应用程序中使用不同的前缀,否则如果您只选择一个并坚持使用它会更简单。

或者,您可以使用较新的表达式语法进行访问控制,这可能更容易理解并且根本不需要任何特殊的命名约定。