【问题标题】:Spring security authrorize based on input parameter criteria基于输入参数标准的 Spring 安全授权
【发布时间】: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 的决定。

标签: java spring security spring-security authorization


【解决方案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!谢谢
猜你喜欢
  • 2011-12-04
  • 2016-08-04
  • 2011-07-12
  • 2017-05-10
  • 2012-04-07
  • 2020-11-29
  • 2013-01-07
  • 1970-01-01
相关资源
最近更新 更多