主要麻烦在于LifecycleBeanPostProcessor和AuthorizationAttributeSourceAdvisor的配置。
LifecycleBeanPostProcessor可以配成static的,但AuthorizationAttributeSourceAdvisor依赖securityManager,所以就不太方便配成static的了。
因为securityManager会依赖realm,而realm往往需要依赖dataSource这样的bean,比如JdbcRealm。但AuthorizationAttributeSourceAdvisor在注入的时候,dataSource还没有被注入进来,这时用@Autowired DataSource dataSource,注入的会是个null。
那么怎么办呢?
那么怎么办呢?
解决办法是需要把securityManager和realm先各自独立的注入进来,然后再找个地方组装
我是通过ApplicationContextAware来实现的,把securityManager和realm的装配放到 setApplicationContext里面
@Configuration
public class ShiroConfig implements ApplicationContextAware {
......
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
try {
//组装realm到securityManager中
final Realm myRealm = (Realm) applicationContext.getBean("myRealm");
final DefaultWebSecurityManager sm = (DefaultWebSecurityManager) applicationContext
.getBean("securityManager");
sm.setRealm(myRealm);
} catch (Exception e) {
throw new Error("Critical system error", e);
}
}
}