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;
    }

 

posted @ 2018-11-18 11:19  涛先森の日常  阅读(650)  评论(0编辑  收藏  举报