spring boot 前后端分离整合shiro(三)ShiroConfig
编写shiro的config,主要有三点
- 配置拦截器
- 配置核心的SecurityManager(安全管理器)
- 注入自定义的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看一下
本质上都是类,常用的有三个
- anon:无需登录即可访问
- authc:需要登录才能访问
- roles:需要特定的角色才能访问
也可以自定义拦截器来满足不同的需求。
版权声明:本文为HuYiAn1004原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。