SpringBoot整合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;
    }

文章作者: Ciwei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ciwei !
 上一篇
利用 Nginx 实现限流 利用 Nginx 实现限流
在当下互联网高并发时代中,项目往往会遇到需要限制客户端连接的需求。我们熟知的 Nginx 就提供了有这样的功能,可以简单的实现对客户端请求频率,并发连接和传输速度的限制…. Nginx 限流Nginx为我们提供了请求限制模块(ngx_ht
2018-07-30
下一篇 
SpringBoot整合Mybatis-Plus SpringBoot整合Mybatis-Plus
SpringBoot整合Mybatis-plus 新建一个项目。pom文件中加入Mybatis依赖,完整pom如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=
2018-07-26
  目录