基于输入参数标准的 Spring 安全授权
Posted
技术标签:
【中文标题】基于输入参数标准的 Spring 安全授权【英文标题】:Spring security authrorize based on input parameter criteria 【发布时间】:2012-07-24 17:40:14 【问题描述】:我有一个场景,我需要根据用户的权限和传递的输入参数的组合来授权用户。
这是当前的场景
public void bookTicket(String bookingType)
if (bookingType == "AIR")
bookAirTicket();
else
bookBusTicket();
@PreAuthorize("hasRole('BOOK_AIR')")
private void bookAirTicket()
@PreAuthorize("hasRole('BOOK_BUS')")
private void bookBusTicket()
我们可以有一些类似的东西
@PreAuthorize(("hasRole('BOOK_AIR')" AND bookinType='AIR') OR ("hasRole('BOOK_BUS')" AND bookinType='BUS'))
public void bookTicket(String bookingType)
if (bookingType == "AIR")
bookAirTicket();
else
bookBusTicket();
基本上我需要基于输入参数的授权
谢谢
【问题讨论】:
您可以阅读AccessDecisionVoter
以做出ConsensusBased
的决定。
【参考方案1】:
是的,你可以。参数可以作为 Spring EL 变量访问。事实上参考手册给出了several examples which use method parameters。该类需要在存在调试符号的情况下进行编译(通常是这种情况)。
注意注释值是单个表达式字符串:
"(hasRole('BOOK_AIR') and #bookinType == 'AIR') or (hasRole('BOOK_BUS') and #bookinType='BUS')"
在实践中,使用复杂的表达式相当容易出错。您还可以使用更简单的表达式,例如
"@accessChecker.check('book', #bookinType)"
accessChecker
是您的应用程序上下文中的一个 bean,它具有“检查”方法,该方法根据是否允许提供的操作信息返回 true 或 false(您可以通过自己访问安全上下文来检查当前用户的角色 - 您' 会发现在 SO 的其他地方讨论过的内容)。
您也可以考虑编写自己的 AccessDecisionManager
或 AccessDecisionVoter
并在其中插入功能,但这需要更多内部知识。
【讨论】:
关于 Spring EL 如何容易出错以及如何避免它的建议非常宝贵。为此+10!谢谢以上是关于基于输入参数标准的 Spring 安全授权的主要内容,如果未能解决你的问题,请参考以下文章
spring-security-oauth2.0 SSO大体流程图
使用oauth2向授权URL添加附加参数的Spring安全性?