基于自定义布尔属性值的 Spring Security @PreAuthorize [关闭]

Posted

技术标签:

【中文标题】基于自定义布尔属性值的 Spring Security @PreAuthorize [关闭]【英文标题】:Spring Security @PreAuthorize based on custom boolean property value [closed] 【发布时间】:2019-04-14 08:29:40 【问题描述】:

我有一个应用程序,用户可以在其中输入自定义角色名称和权限。 例如,用户可以创建一个名为“Human Resources”的角色,该角色具有以下属性:

showDashboard = true;
showSuppliers = false;
showEmployees = true;

我想根据showSuppliers 属性限制getSuppliers 服务。

@PreAuthorize("WHEN showSuppliers IS TRUE")
public Page<Supplier> getSuppliers();

角色实体:

@Entity
public class Role 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    private Long id;

    private String name;

    private boolean showDashboard;
    private boolean showSuppliers;
    private boolean showEmployees;

【问题讨论】:

【参考方案1】:

您可以在PreAuthorize 表达式中引用一个bean。首先是这个bean/组件:

@Component("authorityChecker")
public class AuthorityChecker 

    public boolean canShowSuppliers(Authentication authentication) 
        for (Authority authority : authentication.getAuthorites()) 
            Role role = (Role)authority; // may want to check type before to avoid ClassCastException
            if (role.isShowSuppliers()) 
                return true;
            
        
        return false;
    


对此的注释将是:

@PreAuthorize("@authorityChecker.canShowSuppliers(authentication)")
public Page<Supplier> getSuppliers();

它将当前用户的Authentication对象传递给上面的bean/组件。

【讨论】:

我根据您的回答创建了一个组件,该组件从经过身份验证的用户返回整个角色对象,然后检查@PreAuthorize 上的每个属性。

以上是关于基于自定义布尔属性值的 Spring Security @PreAuthorize [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

布尔值的自定义访问器

在 spring-data-jpa 中通过布尔属性查询而不使用方法参数

如何使用 grails 1.3.2 和插件 spring-security-core 1 实现自定义 FilterSecurityInterceptor?

如何将属性与 Spring XML 中 Apache Camel 路由中的(布尔)文字进行比较?

基于Spring开发——自定义标签及其解析

更改布尔值的默认值