基于输入参数标准的 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 的其他地方讨论过的内容)。

您也可以考虑编写自己的 AccessDecisionManagerAccessDecisionVoter 并在其中插入功能,但这需要更多内部知识。

【讨论】:

关于 Spring EL 如何容易出错以及如何避免它的建议非常宝贵。为此+10!谢谢

以上是关于基于输入参数标准的 Spring 安全授权的主要内容,如果未能解决你的问题,请参考以下文章

基于 Spring 安全组的授权 [关闭]

基于 ROLES 的 Spring 安全授权不起作用

spring-security-oauth2.0 SSO大体流程图

使用oauth2向授权URL添加附加参数的Spring安全性?

如何通过数据库的LDAP和基于角色的授权实现Spring安全?

我应该使用基于 Spring 安全角色的授权还是 Angular Route Guards 或两者兼而有之? [关闭]