1

我对 Spring 安全性很陌生,只是通过参考,做一些例子。我非常想念的一个功能(我想知道几乎没有其他人似乎想念它)是向用户提供自定义信息,为什么或出于什么原因拒绝访问。例如,我想通知用户他无权访问模块 A,或者他需要被授予角色访问权限 B 等。

我看了一下角色界面,但这个信息似乎丢失了:

int vote(Authentication authentication, Object object, List<ConfigAttribute> config);

Spring Security Access Denied logging with missing role 这就是说,我必须提供AccessDecisionManager的自定义实现。

但是,如果访问被拒绝,实际实现会如何提供特定信息?以及如何将其与 Spring Security 挂钩?对于初学者来说,简单的基于角色的访问就足够了。任何人都可以提供任何例子吗?

4

1 回答 1

2

看看AffirmativeBased- DecisionManager。您可以增强它并向AccessDeniedException. 但是从Voter他们拒绝访问的原因中找出原因似乎并不容易。(我希望你能找到一些命名模式,或者你甚至需要扩展选民)。

这是一个如何配置您的自定义 DecisionManager 的示例

 <security:http auto-config="true" access-decision-manager-ref="myDecisionManager">

 <bean id="myAccessDecisionManager"
    class="MyAffirmativeBasedDecisionManager">
    <constructor-arg name="decisionVoters">
        <list>
            <ref bean="roleVoter" />
            <ref bean="authenticatedVoter" />
            <ref bean="preAdviceVoter" />
        </list>
    </constructor-arg>
</bean>


<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter" />

<bean id="authenticatedVoter"
    class="org.springframework.security.access.vote.AuthenticatedVoter" />

<bean id="preAdviceVoter"
    class="org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter">
    <constructor-arg ref="exprPreInvocationAdvice" />
</bean>

    <bean
    class="org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice"
    id="exprPreInvocationAdvice">
    <property name="expressionHandler" ref="methodExprHandler" />
</bean>

<bean id="methodExprHandler"
    class="org.springframework.security.access.expression.method.ExtensibleMethodSecurityExpressionHandler">
    <property name="methodSecurityExpressionRootFactory">
            <bean
            class="com.queomedia.infrastructure.security.spring.MethodSecurityExpressionRootFactoryImpl" />
    </property>
</bean>
于 2012-10-08T12:53:15.250 回答