springboot整合shiro使用shiro-spring-boot-web-starter

此文章仅仅说明在springboot整合shiro时的一些坑,并非教程html

增长依赖web

<!-- 集成shiro依赖 -->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-web-starter</artifactId>
    <version>1.4.0-RC2</version>
</dependency>

配置三个必须的Beanspring

  1. Realm
    用于受权和登陆
@Bean
        public Realm realm() {
            //建立本身的Realm实例
            return new UserRealm();
        }
  1. ShiroFilterChainDefinition
    用于实现权限
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        
        // 三种方式实现定义权限路径
        // 第一种:使用角色名定义
        chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]");

        // 第二种:使用权限code定义
        chainDefinition.addPathDefinition("/docs/**", "authc, perms[document:read]");

        // 第三种:使用接口的自定义配置(此处配置以后须要在对应的接口使用@RequiresPermissions(""))
        chainDefinition.addPathDefinition("/**", "authc");
        return chainDefinition;
  1. CacheManager
    缓存管理
@Bean
        protected CacheManager cacheManager() {
            return new MemoryConstrainedCacheManager();
        }

还有一些配置,能够在配置文件中配置,具体配置项见 shiro配置apache


如下内容是为了实现先后端分离,配置shiro拦截器实现返回401状态码的需求后端

编写拦截器类缓存

public class FormLoginFilter extends PathMatchingFilter {
    @Override
    protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        Subject subject = SecurityUtils.getSubject();
        boolean isAuthenticated = subject.isAuthenticated();
        if (!isAuthenticated) {
            HttpServletResponse resp = (HttpServletResponse) response;
            resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            resp.getWriter().print("NO AUTH!");
            return false;
        }
        return true;
    }
}

在以前配置的三个Bean的基础上多配置一个BeanShiroFilterFactoryBeanspringboot

@Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 必须设置SecuritManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
        //配置拦截器,实现无权限返回401,而不是跳转到登陆页
        filters.put("authc", new FormLoginFilter());
        // 若是不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
        shiroFilterFactoryBean.setLoginUrl("/login");
        // 登陆成功后要跳转的连接
        shiroFilterFactoryBean.setSuccessUrl("/index");
        // 未受权界面;
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");
        // 拦截器
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
        // 过滤链定义,从上向下顺序执行,通常将 /**放在最为下边
        // authc:全部url都必须认证经过才能够访问; anon:全部url都均可以匿名访问
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

此处配置了过滤链,上面三个必须的Bean中修改其中的ShiroFilterChainDefinitionapp

@Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        //不须要在此处配置权限页面,由于上面的ShiroFilterFactoryBean已经配置过,可是此处必须存在,由于shiro-spring-boot-web-starter或查找此Bean,没有会报错
        return new DefaultShiroFilterChainDefinition();;
    }
相关文章
相关标签/搜索