2016-03-16 2 views
0

У меня есть класс с именем Order, показанный ниже.Управление данными JSON с помощью Spring Security

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

Использование Spring безопасности, мне нужно, чтобы иметь возможность контролировать данные, возвращаемые в ответ от Spring Controller. Например, Admin может просматривать все данные заказа, но клиент может видеть только имя и сумму. Как можно фильтровать данные в формате JSON с Spring Security.So, конечный результат для администратора должен быть

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

и выход для клиента должен быть

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

Есть ли способ сделать это

+0

Как насчет https://stackoverflow.com/questions/28794145/spring-data-rest-security-based-projection –

+0

Я хочу управлять данными JSON вместо запроса БД. И я использую критерии Hibernate для запроса базы данных. – Raghavendra

ответ

0

вы можете немного взломать его с помощью данных Spring и 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); 
} 

Вам необходимо добавить Evalua tionContextExtensionSupport. Это позволяет использовать выражение Spring Security в запросах Spring Data:

@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) {}; 

    } 
} 

Или вы могли бы попробовать Projections с Spring Data REST

//untested: 
@Projection(name = "detailed", types = Foo.class) 
public interface FooDetailProjection { 

    @Value("?#{ hasRole('admin')? target.name: null}") 
    public String getName(); 
} 

Или рассмотреть вопрос об использовании Column Security непосредственно в базе данных.

+0

Привет, Не могли бы вы подробнее рассказать о 2-м методе i.e EvaluationContextExtensionSupport. – Raghavendra

+0

@ Raghavendra, который позволяет вам добавлять выражения весны в весенние запросы данных –

Смежные вопросы