>我有一个名为 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();
}
或者考虑直接在数据库中使用列安全性。