开发|ShiroConfig实现基础拦截
1 Shiro核心API以及关系
首先了解一点基本的内容:
Subjrct:用户主体(登录,注销,判断授权等等一些的方法)(把操作交给SecurityManager)
SecurityManager:安全管理器(关联Realm)
Realm:Shiro连接数据的桥梁(操作查询数据库或配置文件,获取用户的信息)
2 导入对应依赖
在编写代码前,应先将所需要的依赖进行导入,这里放了shiro与spring整合依赖,其他依赖按需要进行导入。
<!-- shiro与spring整合依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
3 新建ShiroConfig类
首先就是新建ShiroConfig配置类,并写上对应注解@Configuration
图3.1
然后是在这个配置类里需要创建三个Bean,分别是
1.ShiroFilterFactoryBean;
2.DefaultWebSecurityManager;3.Realm。
4 实现步骤
4.1
首先是Realm,先创建一个自定义的UserRealm类,在这个类是放编写一些查询的方式方法、认证授权的一些逻辑。这个类需要先继承AuthorizingRealm,会分别实现两个方法,如下(还没写认证等方法):
public class UserRealm extends AuthorizingRealm {
//执行一些授权逻辑
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
return null;
}
//执行一些认证逻辑
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行认证逻辑");
return null;
}
}
4.2
然后回到Config类,写Realm Bean(不要忘记写注解!):
//3.Realm Bean
@Bean(name = "Realm")
public UserRealm getRealm() {
return new UserRealm();
}
4.3
接着写DefaultWebSecurityManager,用@Qualifier("Realm")将userRealm传进来:
//2.DefaultWebSecurityManager
@Bean(name = "DefaultWebSecurityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("Realm")UserRealm userRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联realm
securityManager.setRealm(userRealm);
return securityManager;
}
4.4
最后是ShiroFilterFactoryBean,在这里面就可以写需要拦截过滤或放行的页面接口,也可以修改在页面被拦截后需要跳转到的页面接口(默认页面为login.jsp):
//1.ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("DefaultWebSecurityManager")DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器,关联一个securityManager,也是通过Qualifier注解拿到
shiroFilterFactoryBean.setSecurityManager(securityManager);
//添加Shiro过滤拦截器
/**
*常用过滤器
* anon:无需登录(认证)可以访问
* authc:必须认证才可以访问
* user:如果使用remeberMe的功能,可以直接访问
* perms:该资源必须得到资源权限才可以访问
* role:该资源必须得到角色权限才可以访问
*/
Map<String, String> filterMap = new LinkedHashMap<String, String>();
//需要过滤的东西,不拦截的放前面
filterMap.put("/add", "authc");
filterMap.put("/delete", "authc");
//修改拦截后跳转的页面
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
}
5 注意点
需要注意,容易出错的地方:
1.依赖的版本,可能程序运行出错由于版本冲突。
2.不要忘记注解的书写,如上面的@Configuration、@Bean等。
3.在最后写过滤器时,其中的接口不要留空,否则会找不到之类的报错。
4.写过滤时,放行的写在前面,拦截的写在后面。
END
主 编 | 张祯悦
责 编 | yellow
- 关于oracle中的半连接(r3笔记55天)
- 关于正则表达式第三篇(r3笔记第52天)
- 关于正则表达式第四篇(r3笔记第53天)
- 外部表简单总结(r3笔记第51天)
- 通过shell脚本监控sql执行频率(r3笔记第50天)
- 和Null有关的函数(r3笔记第48天)
- 关于查询转换的一些简单分析(二) (r3笔记第68天)
- 跨网络拷贝文件的简单实践(r3笔记第67天)
- 关于enq: TX - allocate ITL entry的问题分析(r3笔记第66天)
- Tensorflow学习:使用Tensorflow搭建深层网络分类器
- 关于interval partitioning(r3笔记65天)
- Spark Tips4: Kafka的Consumer Group及其在Spark Streaming中的“异动”(更新)
- 关于数据库中的一些name(r3笔记第64天)
- 码农的瑞士军刀-脚本语言
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spark Core——RDD何以替代Hadoop MapReduce?
- k8s基础概念及术语
- msf工具之木马程序制作以及伪装
- 一次服务器沦陷为肉鸡后的实战排查过程!
- 使用 centOS 7 部署前端项目
- PHP rand() 函数随机整数。
- PHP使用htmlspecialchars方法实现像ASP的Server.HTMLEncode一样的效果
- jquery.ajax()怎么把获取来的内容转为JSON,并使用。
- Spring:IOC 控制反转
- Spring:AOP 面向切面编程
- JavaScript进阶教程(5)-一文让你搞懂作用域链和闭包
- JavaScript进阶教程(6)—硬核动图让你轻松弄懂递归与深浅拷贝
- Spring:JDBC Template,声明式事务
- Spring:讲解编程题
- SpringMVC:基本应用