Spring AOP и конфигурация apache shiro. Аннотации не были отсканированы - PullRequest
2 голосов
/ 28 июля 2011

Я боролся с конфигурацией, которая требует знаний в AOP.

Я должен признать, что АОП - это та часть, которую я пытаюсь получить некоторое время без успеха.Кажется, что мои аннотации shiro не сканируются и поэтому игнорируются.

я пробовал использовать shiro 1.1.0+ maven3 + spring 3.0.5.RELEASE, hibernate 3.6.1.Final с ZK 5.0.6.у меня работает мой hibernaterealm, я общаюсь с базой данных, у меня работает аутентификация, я успешно (я верю) загружаю роли и разрешения.

так, чтобы проверить сторону авторизации, у меня есть где-то в моем коде это:

  Subject currentUser = SecurityUtils.getSubject();
   if (!currentUser.isPermitted("businessaccount:list")) {
    throw new AuthorizationException("User not authorized");
  }

, и он работает нормально.
Так что я знаю, что мои разрешения были загружены. Я буду удобендля меня, используя аннотации, я поместил его в класс реализации, потому что я не планировал сначала использовать интерфейс с моими классами контроллера, которые расширяют ZK GenericForwardController.

я видел это ошибка и я решил попробовать один интерфейс с @RequiresPersmissions для методов.

, очевидно, он все еще не работает, так как он дает доступ к неавторизованной теме. В моем журнале нет ошибок. Может быть, я делаю что-то не так, вот фрагмент кода:

@Component("layouteventhandler")
public class LayoutEventHandlerImpl extends GenericForwardComposer implements     LayoutEventHandler {

Logger logger = Logger.getLogger(LayoutEventHandlerImpl.class);
Menuitem logout;

//...


@Override
public void onClick$pAccounts() {
    try {
        execution.sendRedirect("/accounts/personal/list");
    } catch (Exception ex) {
        logger.info("Error redirecting to personal accounts", ex);
    }
}


@Override
public void onClick$bAccounts() {
  try {
        execution.sendRedirect("/accounts/business/list");
    } catch (Exception ex) {
        logger.info("Error redirecting to business accounts", ex);
    }
}
//.....
} 

его интерфейс это:

public interface LayoutEventHandler {

@RequiresPermissions(value="personalaccount:list")
public void onClick$pAccounts();

@RequiresPermissions(value="businessaccount:list")
public void onClick$bAccounts();
//.....

 }

вот мое приложение shirocontext

<bean id="hibernateRealm" class="com.personal.project.admin.webapp.security.DatabaseRealm" />
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="realm" ref="hibernateRealm" />
</bean>

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
      depends-on="lifecycleBeanPostProcessor">
 <!--          <property name="proxyTargetClass" value="true" />-->
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean>

<!-- Secure Spring remoting:  Ensure any Spring Remoting method invocations can be associated
     with a Subject for security checks. -->
<bean id="secureRemoteInvocationExecutor" class="org.apache.shiro.spring.remoting.SecureRemoteInvocationExecutor">
    <property name="securityManager" ref="securityManager"/>
</bean>
<!-- ... -->

это то, что я должен сделать?спасибо за чтение и помощь

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

Я не знаю, Широ, но я предполагаю, что вы поместили аннотации в ваши классы бинов, которые реализуют интерфейсы, а затем проксируете их для безопасности, транзакций и / или чего-то еще.Когда это происходит, возвращаемый объект является динамическим прокси JDK, который не является экземпляром конкретного класса вашего компонента, а только реализует интерфейс, который он реализует.Поэтому любое сканирование аннотаций, которое зависит от аннотаций в конкретном классе, не найдет их.

0 голосов
/ 25 января 2018

Я столкнулся с подобной проблемой, когда работал в двух весенних контекстах.Существует родительский корневой контекст, который определил веб-компоненты Database, Service, Security и не SpringMVC, а также дочерний веб-контекст для API-интерфейса Spring MVC REST, который содержит контроллеры, которые я хочу прокси.Конфигурацией для каждого контекста было сканирование пути к классу отдельных пакетов.

В этом случае убедитесь, что запрашиваемые bean-компоненты DefaultAdvisorAutoProxyCreator и AuthorizationAttributeSourceAdvisor определены в дочернем веб-контексте (т. Е. Где контроллеры остальных объектов сканируются путем к классу)) так как определение их в родительском контексте не работает (задним числом в документации по DefaultAdvisorAutoProxyCreate об этом совершенно ясно!)

0 голосов
/ 03 сентября 2013

Чтобы расширить ответ Райана Стюарта, вам нужно добавить

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)

в реализующий класс (не интерфейс) и переместите аннотации Shiro в него.

...