Лучшие практики для предоставления прав с использованием Spring Security и / или Shiro - PullRequest
2 голосов
/ 16 мая 2011

Меня интересуют мнения о том, как лучше всего реализовать концепцию «прав» с помощью Spring Security или Shiro.

Например, представьте, скажем, конечную точку JAX-RS с такой подписью:

AccountDetails getAccountDetails(String accountId);

Используя Spring Security, я мог бы аннотировать такую ​​реализацию:

@Secured(AUTHORIZED_USER)
public AccountDetails getAccountDetails(String accountId) { ... }

или используя Широ,

@RequiresAuthentication
public AccountDetails getAccountDetails(String accountId) { ... }

Тем не менее, я ищу некоторые рекомендации по «наилучшим методам» о том, как гарантировать, что у пользователя есть разрешение на доступ к определенному идентификатору учетной записи (который, я думаю, называется «управлением правами»).

Я мог бы представить несколько разных подходов:

@Secured(AUTHORIZED_USER)
@AccountEntitled
public AccountDetails getAccountDetails(@Account String accountId) { ... }

(что кажется мне не совсем понятным при использовании Spring Security, но я бы хотел ошибиться).

Или я мог бы представить введение доменного объекта AccountId и фабрики, которая преобразует String в AccountId только в том случае, если принцип, поддерживаемый текущим контекстом безопасности, позволяет пользователям видеть эту учетную запись. , Но это начинает становиться немного грязным.

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

Спасибо за любые предложения.

1 Ответ

1 голос
/ 21 июня 2013

Похоже, что вы пытаетесь реализовать защиту на уровне строк для определенных учетных записей. Существуют и другие вопросы Stackoverflow ( Как реализовать защиту на уровне строк в Java? и Решение для защиты на уровне строк, не зависящее от базы данных ), в которых обсуждаются возможные решения этой проблемы. Кроме того, ссылка, приведенная в первом ответе, обсуждает реализацию Row Level Security с Spring и Hibernate . Однако ответ с более высоким рейтингом рекомендует применять безопасность на уровне строк непосредственно на уровне базы данных.

Поработав с Широ, я могу сказать, что это возможно. Однако вы должны реализовать свои собственные структуры безопасности (Области, Разрешения, Аннотации), чтобы приспособить тип функциональности, которую вы описываете. Один из подходов заключается в добавлении аннотации, аналогичной той, что есть в вашем последнем примере, которая указывает, что метод требует проверки прав доступа. Эта аннотация будет привязана к перехватчику, который, в свою очередь, сгенерирует соответствующее разрешение, а затем вызовет инфраструктуру безопасности для проверки разрешения.

Это будет выглядеть примерно так.

Метод:

@RequiresAuthorization
@Entitled
public AccountDetails getAccountDetails(@Account String accountId) {...}

Перехватчик:

@Interceptor
@Entitled
public class EntitledInterceptor {
    @AroundInvoke
    public void interceptOrder(InvocationContext ctx) {
        // return type is AccountDetails 
        // parameter[0] is acccoundId
        Permission p = new CustomPermission(context.getMethod().getReturnType(),
                                            ctx.getParameters()[0]);
        if(SecurityUtils.getSubject().isPermitted(p)){
          return ctx.proceed();
        } else {
         throw new RowLevelSecurityException("No access!");
        }
}

Realm:

public boolean isPermitted(SubjectPrincipals principal, Permission p){
    if( p instanceof CustomPermission){
        CustomPermission cp = (CustomPermission) p;
        Class<?> type = cp.getType(); //AccountDetails
        Integer id = cp.getId(); //accountId
        Integer userId = principal.getPrimaryPrincipal(); //or username
        customPermissionCheckingLogic(userId, type, id);
    }
}

Очевидно, что эта реализация опирается на CDI, и у вас есть способ определить, какие таблицы следует проверять на основе предоставленного типа объекта (аннотации JPA работают в этом отношении). Кроме того, могут быть способы подключиться к сканированию аннотаций Широ, чтобы предоставить больше возможностей прямого / собственного разрешения, чем то, что я сделал здесь.

Документация по перехватчикам CDI.

...