Думаю, Широ был построен, когда Spring 2.0 был на месте.Аннотации Широ (requireRoles и т. Д.) Хорошо работают для bean-компонентов, управляемых пружинным контейнером (сервисный слой), но не работают с аннотацией @Controller.Это связано с тем, что компонент @Controller сканируется компонентом Spring Framework.Я использовал АОП для решения проблемы.Ниже приведено решение, которое сработало для меня.Чтобы приведенное ниже решение работало, вы должны включить следующие четыре банки:
aspectjrt-1.6.11.jar
aspectjweaver-1.6.12.jar
cglib-2.2.2.jar
asm-3.3.1.jar
Если вы используете maven, то вам будет полезна конфигурация ниже.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.12</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
Ниже приведен класс контроллера
import org.apache.shiro.authz.annotation.RequiresRoles;
@Controller
public class PatientController {
@RequiresRoles(“admin,warden”)
@RequestMapping(value="/form")
public String viewPatientForm(Model model, @RequestParam(value="patientId", required=false) Long patientId){
return “somePatientFormJsp”;
}
}
Создайте приведенный ниже аспект для аннотации (RequRoles).Вы можете использовать тот же принцип для создания точек для Требуется разрешение .
import java.util.Arrays;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class WebAuthorizationAspect {
@Before("@target(org.springframework.stereotype.Controller) && @annotation(requiresRoles)")
public void assertAuthorized(JoinPoint jp, RequiresRoles requiresRoles) {
SecurityUtils.getSubject().checkRoles(Arrays.asList(requiresRoles.value()));
}
}
В вашем spring-webApplicationContext.xml везде, где вы упомянули
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- Annotation, so that it's easier to search controllers/components -->
<context:component-scan base-package="com.example.controller"/>
Примечание : Две вышеуказанные конфигурации должны быть помещены вместе в то же spring-webApplicationContext.xml.Иначе это не сработает.Более того, удалить context: annotation-config , если вы использовали его в своей конфигурации. context: component-scan уже сканирует все аннотации.