开发|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
- 记一次数据库的分析和优化建议(r6笔记第24天)
- linux (ubantu)安装最新版python3.6,以及直接安装anaconda
- 【java基础】匿名类
- 朴素贝叶斯法 2016年11月11日
- 11g中关于控制文件自动备份的改进(r6笔记第22天)
- Java基础(02)-15总结对象数组,集合Collection,集合List
- alert日志中的两种ORA错误分析(r6笔记第21天)
- 通过定制orabbix监控分析潜在的Oracle问题 (r6笔记第32天)
- 【C语言练手】C语言画太极图
- 关于奇怪的并行进程分析(一) (r6笔记第41天)
- 关于ora-02391问题的总结(r6笔记第40天)
- 一次数据库响应慢的问题诊断(r6笔记第39天)
- 贝叶斯分类器及Python实现
- R语言中文分词工具
- 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 数组属性和方法