2015-08-07 4 views
1

Я работаю над приложением, в котором у каждого сотрудника есть собственные клиенты.

Когда сотрудник хочет отображать, модифицировать или удалять клиента, я хочу, чтобы этот клиент был одним из этих сотрудников. Это потому, что в URL, чтобы сделать эти действия какКаков правильный способ ограничения доступа к некоторым данным

www.xxx.com/customers/update/{idCustomer}

так, как я действительный доступ к клиенту на данный момент является вызовом службы (с доступом к базе данных), чтобы обеспечить этот клиент является одним из этого сотрудника ,

Это приложение написано на Spring MVC с функцией Spring Security. Я хотел бы знать, есть ли лучший способ сделать тот же доступ к ограничениям?

+1

Это довольно широкий вопрос SO ... Похоже, что ответ безопасности Spring на вашу проблему - это защита объектов домена с ACL и ACE. Вы помещаете объекты домена на те же уровни полномочий, которые вы находите в файлах в достойной файловой системе, и управляете ими с помощью аннотаций метода. Возможно, это не самая простая часть Spring Security, но очень мощная. –

+0

Вы можете добавить внешний ключ сотрудника в таблицу своих клиентов. Таким образом, вы можете контролировать, принадлежит ли клиент работодателю. Это может быть более простой способ решить вашу проблему –

ответ

1

Я нахожу использование hasPermission удобным для таких требований. В частности,

  1. Включить защиту метода путем аннотирования класса конфигурации с @EnableGlobalMethodSecurity(prePostEnabled = true)
  2. Fetch клиента в контроллере, и вызвать метод сервиса, передавая клиенту.
  3. Annotate метод обслуживания с @PreAuthorize

    @PreAuthorize("hasPermission(#customer, 'edit')") 
    public void updateCustomer(Customer customer, ...) { 
    ... 
    
  4. Вы должны быть настроены на PermissionEvaluator, как это:

    @Component 
    public class PermissionEvaluatorImpl implements PermissionEvaluator { 
    
    @Override 
    public boolean hasPermission(Authentication auth, 
        Object entity, Object permission) { 
    
         // return true only if auth has the given 
         // permission for the customer. 
         // Current user can be obtained from auth. 
    } 
    
    ... 
    
    } 
    
  5. уборщицей рисунком, в указанном выше способе, вы можете делегировать проверки прав на классы сущностей, например:

    BaseEntity baseEntity = (BaseEntity) entity; 
    return entity.hasPermission(Util.getUser(auth), (String) permission); 
    

Для получения более подробной информации см. this.

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