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();;
    }
相關文章
相關標籤/搜索