zoukankan      html  css  js  c++  java
  • Shiro:授权的相关实现

    Shiro:授权的相关实现

    一、使用Shiro过滤器实现授权

    设置好授权拦截跳转的请求地址

        /**
         * 创建ShiroFilterFactoryBean
         */
        @Bean
        public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
            ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
            //设置安全管理器
            shiroFilterFactoryBean.setSecurityManager(securityManager);
            
            //添加Shiro内置过滤器
            /**
             * Shiro内置过滤器,可以实现权限相关的拦截器
             * 常用的过滤器:
             *     anon:无需认证(登录)可以访问
             *     authc:必须认证才可以访问
             *  user:如果使用rememberMe的功能可以直接访问
             *  perms:该资源必须得到资源权限才可以访问
             *  role:该资源必须得到角色权限才可以访问
             */    
            Map<String, String> filterMap= new LinkedHashMap<String,String>();
            
            
            //设置拦截后跳转的请求路径
            shiroFilterFactoryBean.setLoginUrl("/user/badRequest");
            //设置未授权提示的页面
            shiroFilterFactoryBean.setUnauthorizedUrl("/user/badRequest");
            shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
            return shiroFilterFactoryBean;
        }

    再使用 filterMap 去放对应的拦截即可,例如 filterMap.put("/**", "anon")

    上面是认证的,如果需要授权的,相应的多给一个任意的授权字符串如 filterMap.put("/user/add", "perms[user:add]")

    授权逻辑编写的位置

        /**
         * 执行授权逻辑
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
            System.out.println("开始执行Shiro的授权方法...");
            
            //给资源进行授权
            SimpleAuthorizationInfo info= new SimpleAuthorizationInfo();
            
            //添加资源的授权字符串
            info.addStringPermission("user:add");
            
            return null;
        }

    授权字符串和之前的字符串对应

    补充

        /**
         * 执行认证逻辑
         */
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
            System.out.println("开始执行Shiro的认证方法...");        
            //编写Shiro判断逻辑,判断用户名和密码
            //判断用户名是否存在
            UsernamePasswordToken token=(UsernamePasswordToken)arg0;
            User user = userMapper.findByUsername(token.getUsername());
            if(user==null)
                return null;
            //判断密码是否正确,参数一为认证的实体
            return new SimpleAuthenticationInfo(user,user.getPassword(),"");
        }

    在执行认证时的SimpleAuthenticationInfo第一个传参可以用来获取当前用户

    /**
         * 执行授权逻辑
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
            System.out.println("开始执行Shiro的授权方法...");
            
            //给资源进行授权
            SimpleAuthorizationInfo info= new SimpleAuthorizationInfo();
            
            //添加资源的授权字符串
            info.addStringPermission("user:register");
            
            //获取当前的登录用户
            User user=(User)SecurityUtils.getSubject().getPrincipal();
            
            
            return null;
        }
  • 相关阅读:
    BOI 2002 双调路径
    BOI'98 DAY 2 TASK 1 CONFERENCE CALL Dijkstra/Dijkstra+priority_queue/SPFA
    USACO 2013 November Contest, Silver Problem 2. Crowded Cows 单调队列
    BOI 2003 Problem. Spaceship
    USACO 2006 November Contest Problem. Road Blocks SPFA
    CEOI 2004 Trial session Problem. Journey DFS
    USACO 2015 January Contest, Silver Problem 2. Cow Routing Dijkstra
    LG P1233 木棍加工 动态规划,Dilworth
    LG P1020 导弹拦截 Dilworth
    USACO 2007 February Contest, Silver Problem 3. Silver Cow Party SPFA
  • 原文地址:https://www.cnblogs.com/it-taosir/p/9977303.html
Copyright © 2011-2022 走看看