zoukankan      html  css  js  c++  java
  • 使用shiro时,如果正常登陆(执行subject.login(token)成功)就能在全局通过SecurityUtils.getSubject().getPrincipal()获取用户信息。

    使用shiro时,如果正常登陆(执行subject.login(token)成功)就能在全局通过SecurityUtils.getSubject().getPrincipal()获取用户信息。

    之前的项目是OK的,新项目中突然出问题。现在给出我自己问题的解决方案。
    shiro的配置中有个use-prefix选项,其配置有两点需要注意:

        要在配置文件的最上边(或者相关属性的最前边);
        一定要先于其它相关配置生效。

    我原先的配置文件中的部分内容如下:

    @Configuration
    public class ShiroConfig {

        @Autowired
        private ManagerAccessControlFilter managerAccessControlFilter;

        @Bean
        public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
            return new LifecycleBeanPostProcessor();
        }

        @Bean
        public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
            DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
            defaultAdvisorAutoProxyCreator.setUsePrefix(true);
            return defaultAdvisorAutoProxyCreator;
        }

     

    我的filter是通过spring注解引用的,而且配置是在setUsePrefix前(这个时候这个倒是其次,即使放前边也是不生效的)。
    如果使用spring的注解,在进入配置文件前肯定是优先被加载的。所以将其更改如下:

    @Bean
        public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
            return new LifecycleBeanPostProcessor();
        }

        @Bean
        public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
            DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
            defaultAdvisorAutoProxyCreator.setUsePrefix(true);
            return defaultAdvisorAutoProxyCreator;
        }

        /**
         * ShiroFilterFactoryBean 处理拦截资源文件问题。
         * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,因为在
         * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
         *
         Filter Chain定义说明
         1、一个URL可以配置多个Filter,使用逗号分隔
         2、当设置多个过滤器时,全部验证通过,才视为通过
         3、部分过滤器可指定参数,如perms,roles
         *
         */
        @Bean
        public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
            ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();

            // 必须设置 SecurityManager
            shiroFilterFactoryBean.setSecurityManager(securityManager);

            ManagerAccessControlFilter managerAccessControlFilter = new ManagerAccessControlFilter();

            //自定义拦截器
            Map<String, Filter> filtersMap = new LinkedHashMap<>();
            filtersMap.put("managerAccessControlFilter", managerAccessControlFilter);
            shiroFilterFactoryBean.setFilters(filtersMap);

            //拦截器
            Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();

            filterChainDefinitionMap.put("/ping", "anon");

            shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
            return shiroFilterFactoryBean;
        }

  • 相关阅读:
    错题集知识(持续更新)
    Java 初始化过程
    java基础自定义测试异常类
    1049 数列的片段和 (20 分)
    1044 火星数字 (20 分)
    1048 数字加密(20分)
    js 全选反选和全不选
    robust programmings
    gdb define command
    好久没有破解别人的无线了, 重温一下
  • 原文地址:https://www.cnblogs.com/lykbk/p/14892481.html
Copyright © 2011-2022 走看看