当前位置: 首页 > 知识库问答 >
问题:

Spring安全的SpEL:将值从XML传递到基于JavaSpEL配置

鲜于高明
2023-03-14

我想将xml文件中指定的属性值传递给Java中的Spring表达式(SpEL)。你能告诉我如何做到这一点吗?为了清楚起见,我提供了以下示例。

实例xml文件:

<beans>
    <bean id="user" class="x.y.User">
        <property name="name" value="A"/>
        <property name="userId" value="33"/>

    <bean id="customer" class="x.y.Customer">
        <property name="name" value="B"/>
        <property name="customerId" value="33"/>      
    </bean>   
</beans>

请记住,我有“用户”和“客户”模型类。

我想通过以下方式使用预授权注释和Spring表达式来保护名为“edit”的方法。

@PreAuthorize("(#user.userId == #customer.customerId)")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

问题是,如何将userId和CusterId的值从“example.xml文件传递到上面的表达式来比较这两个值,然后保护“编辑”方法?

注意:我不想使用权限计算器。请告诉我是否可以在不考虑许可评估者的情况下执行此操作。我们将非常感谢您的支持与合作!。

共有3个答案

南门鸿哲
2023-03-14

为什么将用户和客户声明为Springbean?

子车灿
2023-03-14

@罗布,这不管用如果userBean的userId和customerBean的customerId相等,则允许使用edit方法。根据您的建议,应按以下方式书写:

@PreAuthorize("@userBean.userId == @customerBean.customerId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}   

但它返回以下错误:

java.lang.IllegalArgumentException: Failed to evaluate expression '(@userBean.userId == @customerBean.customerId)'

有什么建议吗?

更新。将@userBean.userId更改为@user.userId,将@CusterBean.customerId更改为@customer.customerId

巫新知
2023-03-14

您可以使用@在SpEL表达式中引用bean引用。

我对您的示例做了一点修改,以使SpEL表达式的哪一部分引用bean,哪一部分引用方法参数更加明显。给定以下配置:

<beans>
    <bean id="userBean" class="x.y.User">
        <property name="name" value="A"/>
        <property name="userId" value="33"/>

    <bean id="customerBean" class="x.y.Customer">
        <property name="name" value="B"/>
        <property name="customerId" value="33"/>      
    </bean>   
</beans>

仅当User参数的userId33(这是userBeansuserId属性的值)时,才允许使用此方法。

@PreAuthorize("#user.userId == @userBean.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

类似地,您可以使用以下内容引用id为customerBean(在我的示例XML中定义)的客户:

@PreAuthorize("#custmer.userId == @customerBean.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

如果希望它对当前的XML配置执行相同的操作,可以使用以下命令。这里的要点是@后面的值应该与bean的名称匹配。

@PreAuthorize("#user.userId == @user.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}
 类似资料:
  • 我正在使用TestNG执行单元测试,其中我正在使用xml文件中定义的测试用例测试我的代码。 我正在使用xml文件中定义的测试用例执行登录操作。但问题是我想在方法登录中以usersname和password的形式发送参数。 是否可以将值(用户名和密码)传递给执行测试用例的xml文件中的登录方法? 下面是我的XML文件 谢谢

  • 在Spring security 2.0.4中,声明如下所示,过滤器的位置也在各个bean声明中声明..... 旧的security.xml Spring Security:如何排除某些资源? https://www.baeldung.com/security-none-filters-non-access-permitall null

  • 问题内容: 我尝试不使用任何xml。 像这样一个:转换为@Bean 问题在这里。 尝试将“ com.cloudlb.domain.User”转换为Class []无效。 错误:投放问题。 先感谢您。 问题答案:

  • 我试图使用Spring的表达式语言(SpEL)将属性从我的文件传递到SpEL方法调用中。 我在一个Spring Boot和Spring Security环境中,我正试图在注释中这样做。我能够调用方法,而不会出现如下问题: 这工作罚款。它验证用户具有授权令牌。但是,我希望将此值外部化为配置属性。这不起作用: 我也试过了 和 那么,如何使用SpEL将应用程序属性作为SpEL方法参数传递?这可能吗?

  • 我是Spring的新手,尝试将基于xml的配置转换为注释basic。我读了这个教程。它与基于xml的配置完美结合。MVCSpring积垢教程 现在我将所有基于xml的配置转换为注释,但我有一个问题。我几乎把我读到的东西都读了一遍,但我没有解决这个问题。 组织。springframework。豆。工厂BeanCreationException:创建名为“personController”的bean时

  • Spring引导2.3.4,Spring安全,固定REST控制器(endpoint)。