apache-shiro 的怪事通过 spring-boot 集成到 spring-mvc 中

Posted

技术标签:

【中文标题】apache-shiro 的怪事通过 spring-boot 集成到 spring-mvc 中【英文标题】:odd things of apache-shiro integrated into spring-mvc via spring-boot 【发布时间】:2015-10-03 21:30:41 【问题描述】:

我想使用 apache-shiro 来保护我的 URL。 所以,我做了这个配置

@Configuration
public class ApplicationConfigShiro 

    @Bean
    public ShiroFilterFactoryBean shiroFilter() 
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager());
        return factoryBean;
    

    // blah blah ...

    @Bean(name = "realm")
    @DependsOn("lifecycleBeanPostProcessor")
    public PropertiesRealm realm() 
        // blah blah
    

    @Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() 
        return new LifecycleBeanPostProcessor();
    

    @Bean
    @DependsOn("lifecycleBeanPostProcessor")
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() 
        return new DefaultAdvisorAutoProxyCreator();
    

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() 
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager());
        return advisor;
    

这是我的 mvc-request-method

@Controller
@RequestMapping("/html")
public class HtmlController 

    @Resource
    private UserService userService;

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public ModelAndView listUsers() 
        List<User> users = userService.findAllUsers();
        ModelAndView modelAndView = new ModelAndView("users");
        modelAndView.addObject("users", users);
        return modelAndView;
    


一切都很好。我通过mvn spring-boot:run 开始我的项目。并查看http://localhost:8080/mappings json 结果可以告诉我映射/html/users 已准备好使用。 我确实检查了http://localhost:8080/html/users,很好。

但是一旦我将 shiro 的注释(如 @RequiresAuthentication)添加到我的请求映射方法中,如下所示:

@RequiresAuthentication    // **I ADD THIS LINE**
@RequestMapping(value = "/users", method = RequestMethod.GET)
public ModelAndView listUsers() 
    List<User> users = userService.findAllUsers();
    ModelAndView modelAndView = new ModelAndView("users");
    modelAndView.addObject("users", users);
    return modelAndView;

重新运行这个项目,重新检查http://localhost:8080/mappings,映射/html/users刚刚消失。尝试访问 http://localhost:8080/html/users 我当然得到了 404。

我错过了什么吗?还是这是spring的bug?

请帮帮我。很抱歉给您添麻烦了。

git clone git@github.com:yingzhuo/spring-playground.git
cd spring-playground
mvn clean spring-boot:run

【问题讨论】:

仅供参考,您可能希望将生命周期BeanPostProcessor 方法设为静态,如***.com/a/31412419/618087所讨论的那样 谢谢。 static 确保生命周期BeanPostProcessor 是第一个要创建的bean。 【参考方案1】:

好的,我找到了 myslef 的答案。

@Bean
    @DependsOn("lifecycleBeanPostProcessor")
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() 
        DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
        proxyCreator.setProxyTargetClass(true); // this SETTING
        return proxyCreator;
    

【讨论】:

以上是关于apache-shiro 的怪事通过 spring-boot 集成到 spring-mvc 中的主要内容,如果未能解决你的问题,请参考以下文章

Apache-Shiro:用户在 AJAX 中进行身份验证,登录后如何恢复 GET-Variables?

Apache-Shiro

Apache-Shiro 和 Chrome [关闭]

Apache-Shiro分布式环境配置(与redis集成)(转)

谁有奇闻怪事未解之迷的资料

关于AVALON MM的怪事