spring security - 编写自定义 SPEL 访问表达式。我的方法正确吗?
Posted
技术标签:
【中文标题】spring security - 编写自定义 SPEL 访问表达式。我的方法正确吗?【英文标题】:spring security - writing a custom SPEL access expression. Is my approach correct? 【发布时间】:2012-04-22 16:58:32 【问题描述】:我希望指定一个拦截 URL 模式,例如 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
以DefaultWebSecurityExpressionHandler
的方式实现WebSecurityExpressionHandler
并使用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
这是解决问题的正确方法吗?
【问题讨论】:
还讨论了here和here 【参考方案1】:在您的 spring 安全配置中,您可以执行以下操作。
<http use-expressions="true">
<intercept-url pattern="/**" access="isFullyAuthenticated() and principal.college matches 'Duke|USC'"/>
这是假设您的主体上有一个 getCollege() 方法。
【讨论】:
以上是关于spring security - 编写自定义 SPEL 访问表达式。我的方法正确吗?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 实现自定义登录和认证:使用自定义的用户进行认证
Spring Security - 无法将默认登录页面更改为自定义
登录后自定义语言环境重定向 - Spring Security
如何在 Spring Security Grails 上自定义 /login/authenticate?
甚至没有调用自定义 Spring Security 身份验证提供程序?
Grails:Spring Security Core 自定义身份验证 getUserByUserName 返回 null 对象