spring boot 前后端分离整合shiro(三)ShiroConfig

spring boot 前后端分离整合shiro(三)ShiroConfig

编写shiro的config,主要有三点

  1. 配置拦截器
  2. 配置核心的SecurityManager(安全管理器)
  3. 注入自定义的realm

配置安全管理器和realm,有个地方要注意,画红线的地方不能直接new一个customizeRealm,必须用bean的方式注入,交给spring管理,否则realm里面的userInfoService注入不了。
在这里插入图片描述
完整代码:

package com.example.demo.config;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author 黄豪琦
 * 日期:2019-07-09 14:04
 * 说明:
 */
@Configuration
public class ShiroConfig {


    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        //SecurityManager 安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        //登录,为后台接口名,非前台页面名, 未登录跳转到这里
        shiroFilterFactoryBean.setLoginUrl("/pub/login");
        //登录成功后跳转的地址,为后台接口名,非前台页面名
        shiroFilterFactoryBean.setSuccessUrl("/api/index");
        //无权限跳转
        shiroFilterFactoryBean.setUnauthorizedUrl("/pub/unauthorized");

        // 过滤链定义,从上向下顺序执行,必须保证是有序的,所以用linked
        LinkedHashMap<String, String> filterMap = new LinkedHashMap<String, String>();

        //公开的接口,都能访问
        filterMap.put("/", "anon");
        filterMap.put("/pub/**", "anon");
        //api下的接口需要认证后才能访问
        filterMap.put("/api/**", "autch");
        //roles表示需要特定的角色才能访问
        filterMap.put("/user/**", "roles[user]");
        filterMap.put("/admin/**", "roles[admin]");
        filterMap.put("/root/**", "roles[root]");
        //防止有忘记写的接口,剩下的都需要认证才能访问
        filterMap.put("/**", "autch");


        //logout是shiro提供的过滤器
        filterMap.put("/logout", "logout");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        return shiroFilterFactoryBean;
    }

    /**
     * 配置核心安全管理器
     * @return
     */
    @Bean(name = "securityManager")
    public SecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //设置自定义realm
        securityManager.setRealm(customizeRealm());

        return securityManager;
    }

    @Bean
    public CustomizeRealm customizeRealm(){
        CustomizeRealm realm = new CustomizeRealm();

        return realm;
    }
}

有个值得注意的地方就是在这里插入图片描述
这个"/**"要放到最后面,因为拦截器的执行顺序是从上到下的,如果这个放到前面了,那么就会拦截所有请求,后面特定的拦截就不会走了。
shiro内置的拦截器
shiro中内置了一些拦截器,可以全局搜索DefaultFilter看一下
在这里插入图片描述
本质上都是类,常用的有三个

  1. anon:无需登录即可访问
  2. authc:需要登录才能访问
  3. roles:需要特定的角色才能访问

也可以自定义拦截器来满足不同的需求。


版权声明:本文为HuYiAn1004原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。