官网地址

程序猿升级课

热爱开源,喜欢摸索


StringBoot整合Shiro

首先第一步引入

  <!--shiro权限控制框架-->
        <dependency>           <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

添加配置类

  • 安全管理器(在管理器中添加自己的验证密码和权限的方法)

     @Bean
      public SecurityManager securityManager() {
          DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
          securityManager.setRealm(myShiroRealm());
          return securityManager;
      }
  • 配置拦截链

    拦截链的意思,就是给url赋值权限

    /**
       * 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);
          // 如果不设置默认会自动寻找Web工程根目录下的"admin登录页面"页面
          shiroFilterFactoryBean.setLoginUrl("/admin/login");
          // 登录成功后要跳转的链接
          shiroFilterFactoryBean.setSuccessUrl("/index");
          // 未授权界面;
          shiroFilterFactoryBean.setUnauthorizedUrl("/403");
    
          // 拦截器.
          Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
          filterChainDefinitionMap.put("/admin/login", "anon");//登录页面
          //TODO 跟登录权限,添加权限test测试。
          filterChainDefinitionMap.put("/admin/index", "authc,perms[" +"test" + "]");//校验密码和权限
          // 配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了
          filterChainDefinitionMap.put("/logout", "logout");
          shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
          return shiroFilterFactoryBean;
      }

实现Realm

  • doGetAuthenticationInfo

    校验密码

    /**
       * 校验用户名和密码
       *
       * @param authcToken
       * @return
       * @throws AuthenticationException
       */
      @Override
      protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
          logger.debug("身份认证方法:MyShiroRealm.doGetAuthenticationInfo()");
          UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authcToken;
          //TODO 根据用户名和用户密码判断用户,用户验证成功,就把用户名和用户密码放行
          String userName = usernamePasswordToken.getUsername();
          Admin user = mongoDao.findOneByQuery(Admin.class, "userName", usernamePasswordToken.getUsername());
          String pwd = String.valueOf(usernamePasswordToken.getPassword());
          if (ObjectUtils.isEmpty(user)){
              throw new IncorrectCredentialsException();
          }
          if (StringUtils.endsWithIgnoreCase(user.getPassword(), pwd)) {
              return new SimpleAuthenticationInfo(userName, pwd, getName());
          }
          return null;
      }
  • doGetAuthorizationInfo

    在本方法中,查询用户的所有权限,然后添加

     /**
       * 权限链配置
       * 在shiro配置类中把资源对应的权限都加载到应用中
       *
       * 在本方法中,查询用户的所有权限,然后添加
       *
       * @param principals
       * @return
       */
      @Override
      protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
          logger.debug("##################执行Shiro权限认证##################");
          //获取当前登录输入的用户名,等价于
          String userName = (String) super.getAvailablePrincipal(principals);
          logger.debug("##################开始查询用户【" + userName + "】的权限##################");
          SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
          //根据每个用户名获得对应的权限列表
          //根据用户名获取用户的权限
          info.addStringPermission("test");
          return info;
      }

posted @ 2017-08-28 19:21  chinesszz  阅读(67)  评论(0编辑  收藏  举报
ヾ(≧O≦)〃嗷~