2013-12-11 6 views
1

Я пытаюсь использовать конфигурацию java Spring Security с аннотациями. В принципе, я бы хотел использовать комбинацию аннотационного подхода со статическими конфигурациями.Spring Security и EnableGlobalMethodSecurity

http 
    .authorizeRequests() 
    .anyRequest().authenticated() 

И

@Controller 
@RequestMapping({"/version", "/*/version"}) 
@PermitAll 
public class VersionController { 
// Implementation 
} 

Вскоре я хочу, чтобы @PermitAll должны иметь приоритет над другими избирателями. Можно ли использовать для этого случая @EnableGlobalMethodSecurity(jsr250Enabled = true)?

ответ

0

Я немного изменил свое мнение и начал думать о другом решении. Если я могу узнать своих контроллеров до начала весенней безопасности, я могу настроить его, обработав их. В основном я создал процессор и мало ставка упрощенного варианта моей реализации является:

@Component 
public class PermitAllProcessor { 

    private static final Logger logger = LoggerFactory.getLogger(PermitAllProcessor.class); 

    @Autowired 
    AbstractHandlerMethodMapping abstractHandlerMethodMapping; 


    public String[] process() { 
     Map<RequestMappingInfo, HandlerMethod> handlerMethods = abstractHandlerMethodMapping.getHandlerMethods(); 
     ArrayList<String> urls = Lists.newArrayList(); 
     for(Map.Entry<RequestMappingInfo, HandlerMethod> entry : handlerMethods.entrySet()) { 
     PermitAll annotation = getPermitAll(entry.getValue()); 
     if(annotation != null) { 
      Set<String> patterns = entry.getKey().getPatternsCondition().getPatterns(); 
      urls.addAll(patterns); 
     } 
     } 
     logger.info("Permitted urls as follows: {}", 
        StringUtils.collectionToDelimitedString(urls, ",", "[", "]")); 
     return urls.toArray(new String[urls.size()]); 
    } 

    private PermitAll getPermitAll(HandlerMethod value) { 
     PermitAll annotation = value.getMethodAnnotation(PermitAll.class); 
     if(annotation == null){ 
     annotation = value.getBeanType().getAnnotation(PermitAll.class); 
     } 
     return annotation; 
    } 
} 

И в основном

.authorizeRequests() 
    .antMatchers(permitAllProcessor.process()).permitAll() 
    .anyRequest().authenticated(); 
0

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

  1. Spring Security применяет правила веб-безопасности
  2. DispatcherServlet выбирает метод hanlder
  3. Метод защиты применяется к методу обработчика, если он содержит аннотации безопасности

Однако вы можете попытаться его достичь, используя d ifferent подход (не проверено):

  • Извлечение метаданных для всех методов обработчиков, как описано here
  • С его помощью можно настроить Spring Secuirty
    Например, выберите RequestMappingInfo с для всех методов, которые имеют свой обычай @PermitAll аннотацию и создать пользовательский RequestMatcher, который вернет true для запросов к этим методам. Затем настройте Spring Security, чтобы каждый мог получить доступ к URL-адресам, которые соответствуют указанному помощнику.
+0

Как лидер проекта Spring Security, я могу подтвердить, что это не возможно с существующей инфраструктурой. В моем варианте лучший подход состоял бы в том, чтобы вообще не использовать защиту на основе URL-адресов и создать собственный источник MethodSecurityMetadata, который по умолчанию требует, чтобы пользователь был аутентифицирован. Это гарантирует, что все меры безопасности будут выполняться по методам. Для примера см. Jsr250MethodSecurityMetadataSource. Вы можете расширить функцию GlobalMethodSecurityConfiguration и переопределить методSecurityMetadataSource, чтобы указать свой собственный метод MethodSecurityMetadataSource. –

+0

@RobWinch Я думал, что добавление JSR250 может сделать трюк. Вот почему я сообщил о SEC-2432. – Cemo

+0

@axtavt Означает ли это, когда весенняя безопасность применяет правила веб-безопасности, у меня нет информации о обработчиках? Я думаю, что чего-то не хватает, потому что я проверил, что голосование имеет необходимую информацию, такую ​​как аннотации метода. Я был бы рад, что если вы сможете расширить небольшую ставку больше. Я подумывал о добавлении Jsr250Voter к моим избирателям. – Cemo

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