9

我有一个场景,我需要根据用户的权限和传递的输入参数的组合来授权用户。

这是当前的情况

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();
    }
    }

基本上我需要基于输入参数的授权

谢谢

4

1 回答 1

15

是的你可以。参数可以作为 Spring EL 变量访问。事实上,参考手册给出了几个使用方法参数的例子。该类需要在存在调试符号的情况下进行编译(通常是这种情况)。

请注意,注释值是单个表达式字符串:

"(hasRole('BOOK_AIR') and #bookinType == 'AIR') or (hasRole('BOOK_BUS') and #bookinType='BUS')"

在实践中,使用复杂的表达式相当容易出错。您还可以使用更简单的表达式,例如

"@accessChecker.check('book', #bookinType)"

您的应用程序上下文中的 bean 在哪里accessChecker具有“检查”方法,该方法根据是否允许提供的操作信息返回 true 或 false(您可以通过自己访问安全上下文来检查当前用户的角色 - 您会发现在别处讨论过关于 SO)。

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

于 2012-07-28T12:36:41.793 回答