Java 基于输入参数条件的Spring安全授权

Java 基于输入参数条件的Spring安全授权,java,spring,security,spring-security,authorization,Java,Spring,Security,Spring Security,Authorization,我有一个场景,需要根据用户的权限和传递的输入参数组合对用户进行授权 这是目前的情况 public void bookTicket(String bookingType) { if (bookingType == "AIR"){ bookAirTicket(); }else{ bookBusTicket(); } } @PreAuthorize("hasRole('BOOK_AIR')") private void b

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

这是目前的情况

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();
    }
    }
"@accessChecker.check('book', #bookinType)"
基本上我需要基于输入参数的授权


谢谢

是的,你可以。参数可以作为Spring EL变量访问。事实上,参考手册给出了。该类需要在存在调试符号的情况下编译(通常是这样)

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

"(hasRole('BOOK_AIR') and #bookinType == 'AIR') or (hasRole('BOOK_BUS') and #bookinType='BUS')"
实际上,使用复杂的表达式很容易出错。您还可以使用更简单的表达式,例如

@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();
    }
    }
"@accessChecker.check('book', #bookinType)"
其中,
accessChecker
是应用程序上下文中的一个bean,它带有一个“check”方法,该方法根据所提供的操作信息是否被允许而返回true或false(您可以自己访问安全上下文来检查当前用户的角色,您会发现在其他地方讨论过这一点)


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

你可以阅读有关
AccessDecisionVoter
的内容,以做出基于
共识的决策。关于Spring EL如何容易出错以及如何避免错误的建议非常宝贵+10英镑!thnx