Spring Boot : 整合 Shiro 認證返回 Json 格式數據

一、簡介

要解決ajax請求和前後端分離 返回數據,問題很簡單,比如你沒有登錄,去請求數據的時候,shiro指定了一個登錄界面,會自動重定向那個界面

二、具體代碼

關鍵步驟:添加shrio自定義攔截器

/**
 * @program: hopson
 * @Date: 2019/10/15 15:43
 * @Author: wangmx
 * @Description:
 */
public class ShiroLoginFilter extends UserFilter {

    @Override
    protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        JSONObject res = new JSONObject();
        res.put("error", "登錄已失效,請重新登錄!");
        res.put("message", "登錄已失效,請重新登錄!");
        res.put("status", 401);
        response.getWriter().print(res.toString());
    }

}

將攔截器添加到shrio配置類中

 /**
 * Shiro的配置文件
 *
 * @author wangmx
 */
@Configuration
public class ShiroConfig {

    /**
     * 單機環境,session交給shiro管理
     */
    @Bean
    @ConditionalOnProperty(prefix = "wangmx", name = "cluster", havingValue = "false")
    public DefaultWebSessionManager sessionManager(@Value("${wangmx.globalSessionTimeout:3600}") long globalSessionTimeout){
       /* DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        sessionManager.setSessionValidationSchedulerEnabled(true);
        sessionManager.setSessionIdUrlRewritingEnabled(false);
        sessionManager.setSessionValidationInterval(globalSessionTimeout * 1000);
        sessionManager.setGlobalSessionTimeout(globalSessionTimeout * 1000);*/

       MySessionManager sessionManager = new MySessionManager();
       sessionManager.setSessionValidationSchedulerEnabled(true);
       sessionManager.setSessionIdUrlRewritingEnabled(false);
       sessionManager.setSessionValidationInterval(globalSessionTimeout * 1000);
       sessionManager.setGlobalSessionTimeout(globalSessionTimeout * 1000);

        return sessionManager;
    }

    /**
     * 集羣環境,session交給spring-session管理
     */
    @Bean
    @ConditionalOnProperty(prefix = "wangmx", name = "cluster", havingValue = "true")
    public ServletContainerSessionManager servletContainerSessionManager() {
        return new ServletContainerSessionManager();
    }

    @Bean("securityManager")
    public SecurityManager securityManager(UserRealm userRealm, SessionManager sessionManager) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        securityManager.setSessionManager(sessionManager);
        securityManager.setRememberMeManager(null);

        return securityManager;
    }


    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);
        //shiroFilter.setLoginUrl("/401");
        //shiroFilter.setUnauthorizedUrl("/401");
	    //這是重點   將攔截器添加到shrio配置類中
        Map<String, Filter> filters = shiroFilter.getFilters();
        filters.put("authc", new ShiroLoginFilter());
        shiroFilter.setFilters(filters);

        Map<String, String> filterMap = new LinkedHashMap<>();

        filterMap.put("/services/*","anon");
        filterMap.put("/swagger/**", "anon");
        filterMap.put("/v2/api-docs", "anon");
        filterMap.put("/swagger-ui.html", "anon");
        filterMap.put("/webjars/**", "anon");
        filterMap.put("/swagger-resources/**", "anon");
        filterMap.put("/doc.html","anon");
        filterMap.put("/druid/**","anon");

        filterMap.put("/statics/**", "anon");
        filterMap.put("/login.html", "anon");
        filterMap.put("/sys/login", "anon");
        filterMap.put("/favicon.ico", "anon");
        filterMap.put("/captcha.jpg", "anon");
        filterMap.put("/**", "authc");
        shiroFilter.setFilterChainDefinitionMap(filterMap);

        return shiroFilter;
    }

    @Bean("lifecycleBeanPostProcessor")
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager);
        return advisor;
    }
}


主要代碼

Map<String, Filter> filters = shiroFilter.getFilters();
filters.put("authc", new ShiroLoginFilter());
shiroFilter.setFilters(filters);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章