Deadbolt — Play Framework — Как проверить @RestrictedResource с параметрами в контроллере?

С помощью модуля Deadbolt мы можем проверить ограниченный ресурс с именем ресурса и параметрами в представлении.

Например, на мой взгляд, он у меня есть, и он хорошо работает:

#{deadbolt.restrictedResource resourceKeys:['Domain'] , resourceParameters:['domainid':domain.id]}
   <li><a href="@{Admin.showDomain(domain.id)}">${domain.title}</a></li>
#{/deadbolt.restrictedResource}

Но в моем контроллере я просто могу проверить имя ресурса, но я не нахожу способа проверить его в моем RestrictedResourcesHandler, передавая идентификатор домена.

Я ищу решение сделать что-то вроде этого:

@RestrictedResource(name = {"Domain"}, params = {domainid})
public static void showDomain(String domainid)
{
}

заранее спасибо


person RodneyRd    schedule 24.07.2012    source источник


Ответы (2)


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

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

Стив (автор Deadbolt)

person Steve Chaloner    schedule 25.07.2012

Я нашел способ решить проблему, не самый лучший, я думаю, но это решение Стива Чалонера (создателя Deadbolt), и оно работает.

Например, если аргумент метода вашего контроллера называется «id», и вы хотите проверить этот идентификатор внутри вашего метода checkAccess:

// Controller's method : 
@RestrictedResource(name = {"Domain"})
public static void showDomain(String id){} 

Просто проверьте в начале вашего метода checkAccess, что карта "resourceParameters" пуста, и используйте объект запроса для получения параметров:

public AccessResult checkAccess(List<String> resourceNames,
                                Map<String, String> resourceParameters)
{    
    Map<String, String> hashm = new HashMap<String,String>();

    if(resourceParameters != null && !resourceParameters.isEmpty()){
        hashm = resourceParameters;
    }else if(Http.Request.current().routeArgs!= null && !Http.Request.current().routeArgs.isEmpty()){
        hashm = Http.Request.current().routeArgs;
    }
}

Затем просто нужно использовать foreach вашу хэш-карту внутри вашего метода checkAccess, чтобы получить аргумент метода вашего контроллера и проверить доступ, как вы хотите.

for (Map.Entry<String,String> mp : hashm.entrySet())
{
    // Get the id argument
    if(mp.getKey().equals("id"))
    {
        // Do something with the value..
        mp.getValue()
    }        
}
person RodneyRd    schedule 17.08.2012