我希望指定一个像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
}
这是解决问题的正确方法吗?
答案 0 :(得分:1)
在Spring安全配置中,您可以执行以下操作。
<http use-expressions="true">
<intercept-url pattern="/**" access="isFullyAuthenticated() and principal.college matches 'Duke|USC'"/>
假设你的主要市场上有一个getCollege()方法。