spring security - 编写自定义SPEL访问表达式。我的方法是否正确?

时间:2012-04-10 11:45:26

标签: java spring spring-security

我希望指定一个像pattern = hasCollege('college1',college2')这样的拦截网址模式。为此,我想到了以下方法:

a)配置WebExpressionVoter以使用自定义表达式处理程序

<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
    <beans:property name="decisionVoters">
        <beans:list>
            <beans:bean class="org.springframework.security.web.access.expression.WebExpressionVoter">
                <beans:property name="expressionHandler" ref="myWebSecurityExpressionHandler"/>
            </beans:bean>
        </beans:list>
    </beans:property>
</beans:bean>
<beans:bean id="myWebSecurityExpressionHandler" class="com.daud.security.EEWebSecurityExpressionHandler"/>

b)以EEWebSecurityExpressionHandler的方式WebSecurityExpressionHandler实施DefaultWebSecurityExpressionHandler并使用createEvaluationContext设置自定义根对象。

@Override
    public EvaluationContext createEvaluationContext(Authentication authentication, FilterInvocation fi) {
        StandardEvaluationContext ctx = new StandardEvaluationContext();
        SecurityExpressionRoot root = new MyWebSecurityExpressionRoot(authentication, fi);
        root.setTrustResolver(trustResolver);
        root.setRoleHierarchy(roleHierarchy);
        ctx.setRootObject(root);
        return ctx;
    }

c)使MyWebSecurityExpressionRoot扩展WebSecurityExpressionRoot并声明与新SPEL表达式对应的新方法:

public final boolean hasCollege(String... colleges){
       // logic goes here
    }

这是解决问题的正确方法吗?

1 个答案:

答案 0 :(得分:1)

在Spring安全配置中,您可以执行以下操作。

<http use-expressions="true">
    <intercept-url pattern="/**" access="isFullyAuthenticated() and principal.college matches 'Duke|USC'"/>

假设你的主要市场上有一个getCollege()方法。