使用 Spring 安全性控制 JSON 数据



>我有一个名为 Order 的类,如下所示。

    class Order{
    private int id;
    private String name;
    private String amount;
    //getters and setters
    }

使用 Spring 安全性,我需要能够控制作为 Spring 控制器响应返回的数据。例如,管理员可以查看订单的所有数据,但客户只能看到名称和金额。如何使用 Spring Security.So 过滤 JSON 数据,管理员的最终输出应该是

     [{id:1,name:order1,amount:100}, {id:2,name:order2,amount:200}] 

客户的输出应该是

    [{name:order1,amount:100}, {name:order2,amount:200}].

有什么办法可以做到这一点

你可以用Spring Data和Spring Security来破解它:

public interface FooRepository extends CrudRepository<Foo, Long> {
    @Query(
            value = "select id, amount, case when ?#{hasRole('admin')} then name else null end as name from foo where id=?1",
            nativeQuery = true
    )
    Foo findOne(Long id);
}

您需要添加一个 EvaluationContextExtensionSupport bean。这允许您在 Spring 数据查询中使用 Spring 安全性表达式:

@Component
public class MyEvaluationContextExtensionSupport extends EvaluationContextExtensionSupport{
    @Override
    public String getExtensionId() {
        return "security";
    }
    @Override
    public SecurityExpressionRoot getRootObject() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return new SecurityExpressionRoot(authentication) {};
    }
}

或者你可以尝试使用Spring Data REST进行投影。

//untested:
@Projection(name = "detailed", types = Foo.class)
public interface FooDetailProjection {
    @Value("?#{ hasRole('admin')? target.name: null}")
    public String getName();
}

或者考虑直接在数据库中使用列安全性。

最新更新