在spring-cloud中使用shiro权限控制,分为网关权限控制和后台逻辑控制。
注意:要在后台做权限认证,必须先在网关做身份认证,将身份认证信息使用redis跨域到后台。应工作原因,本教程,后台部分的跨域问题还未弄,详情参考:https://blog.csdn.net/kunzai6/article/details/80527130
网关权限控制:
一.在网关中主要做用户登录身份认证操作。
1.在pom.xml文件中添加:
<!-- 页面拦截时,需要添加的依赖类 ,一下两个类,是访问页面时必须添加的-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis</artifactId>
<version>2.4.2.1-RELEASE</version>
</dependency>
2.在application.yml中添加
spring:
profiles:
active:
- shiro
3.application-shiro.properties文件中添加如下:
shiro.filter=/css/**,/js/**,/favicon.ico
shiro.logout=/logout
shiro.authc=/**
shiro.loginUrl=/login
shiro.sucessUrl=/index
shiro.errorUrl=/403
4.配置文件ShiroConfig和MyShiroRealm
ShiroConfig内容如下:
@Configuration
public class ShiroConfig {
/** 不需要过滤的文件地址,以逗号(,)分隔 ***/
@Value("${shiro.filter}")
private String strFilter;
/** 配置退出 过滤器 **/
@Value("${shiro.logout}")
private String strLogout;
/** authc:所有url都必须认证通过才可以访问 **/
@Value("${shiro.authc}")
private String strAuthc;
/** 登录地址 **/
@Value("${shiro.loginUrl}")
private String strLoginUrl;
/** 成功后跳转地址 **/
@Value("${shiro.sucessUrl}")
private String strSuccessUrl;
/** 错误地址 **/
@Value("${shiro.errorUrl}")
private String strErrorUrl;
/**
* ShiroFilterFactoryBean 处理拦截资源文件问题。
* 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在
* 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
*
* Filter Chain定义说明 1、一个URL可以配置多个Filter,使用逗号分隔 2、当设置多个过滤器时,全部验证通过,才视为通过
* 3、部分过滤器可指定参数,如perms,roles
*
*/
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 必须设置 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 拦截器.
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
// 配置不会被拦截的链接 顺序判断
String[] arrayFilter = strFilter.split(",");
Map<String, String> map = new Has