【shiro】AccessControlFilter

6、AccessControlFilter

AccessControlFilter提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等:

Java代码

  1. abstract boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;
  2. boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;
  3. abstract boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception;

isAccessAllowed:表示是否允许访问;mappedValue就是[urls]配置中拦截器参数部分,如果允许访问返回true,否则false;

onAccessDenied:表示当访问拒绝时是否已经处理了;如果返回true表示需要继续处理;如果返回false表示该拦截器实例已经处理了,将直接返回即可。

onPreHandle会自动调用这两个方法决定是否继续处理:

Java代码

  1. boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
  2. return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
  3. }

onAccessDenied 会调用(参考 http://www.cnblogs.com/CESC4/p/7597563.html

isAccessAllowed和onAccessDenied是AccessControlFilter的方法
【-A-】调用 FormAuthenticationFilter onAccessDenied 方法
return executeLogin(request, response);

另外AccessControlFilter还提供了如下方法用于处理如登录成功后/重定向到上一个请求:

Java代码

  1. void setLoginUrl(String loginUrl) //身份验证时使用,默认/login.jsp
  2. String getLoginUrl()
  3. Subject getSubject(ServletRequest request, ServletResponse response) //获取Subject实例
  4. boolean isLoginRequest(ServletRequest request, ServletResponse response)//当前请求是否是登录请求
  5. void saveRequestAndRedirectToLogin(ServletRequest request, ServletResponse response) throws IOException //将当前请求保存起来并重定向到登录页面
  6. void saveRequest(ServletRequest request) //将请求保存起来,如登录成功后再重定向回该请求
  7. void redirectToLogin(ServletRequest request, ServletResponse response) //重定向到登录页面

比如基于表单的身份验证就需要使用这些功能。

到此基本的拦截器就完事了,如果我们想进行访问访问的控制就可以继承AccessControlFilter;如果我们要添加一些通用数据我们可以直接继承PathMatchingFilter。



4、扩展AccessControlFilter

AccessControlFilter继承了PathMatchingFilter,并扩展了了两个方法:

Java代码

  1. public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
  2. return isAccessAllowed(request, response, mappedValue)
  3. || onAccessDenied(request, response, mappedValue);
  4. }

isAccessAllowed:即是否允许访问,返回true表示允许;

onAccessDenied:表示访问拒绝时是否自己处理,如果返回true表示自己不处理且继续拦截器链执行,返回false表示自己已经处理了(比如重定向到另一个页面)。

Java代码

  1. public class MyAccessControlFilter extends AccessControlFilter {
  2. protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
  3. System.out.println("access allowed");
  4. return true;
  5. }
  6. protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
  7. System.out.println("访问拒绝也不自己处理,继续拦截器链的执行");
  8. return true;
  9. }
  10. }

然后在shiro.ini中进行如下配置:

Java代码

  1. [filters]
  2. myFilter4=com.github.zhangkaitao.shiro.chapter8.web.filter.MyAccessControlFilter
  3. [urls]
  4. /**=myFilter4
时间: 2024-09-30 13:03:47

【shiro】AccessControlFilter的相关文章

【Shiro】四、Apache Shiro授权

1.授权实现方式 1.1.什么是授权 授权包含4个元素(一个比较流行通用的权限模型) Resources:资源 各种需要访问控制的资源 Permissions:权限 安全策略控制原子元素 基于资源和动作 控制力度 Roles:角色  行为的集合 User:用户主体 Subject,关联Role或Permission 简单来说,可以这样理解:我们登录进系统,我们就是一个[用户]:[用户]可以是一个或多个[角色],一个[角色]可以有多种[权限],这些[权限]代表了我们可以访问哪些[资源].当然[用户

【shiro】(4)---Shiro认证、授权案例讲解

Shiro认证.授权案例讲解 一.认证  1. 认证流程     2.用户密码已经加密.加盐的用户认证 (1)测试类 // 用户登陆和退出,这里我自定了一个realm(开发肯定需要自定义realm获取数据库密码和权限) @Test public void testCustomRealmMd5() { // 创建securityManager工厂,通过ini配置文件创建securityManager工厂 Factory<SecurityManager> factory = new IniSecu

【shiro】(1)---了解权限管理

了解权限管理 一.概念 1.什么是权限管理 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理包括用户认证和授权两部分. (1)用户认证 用户认证,用户去访问系统,系统要验证用户身份的合法性.最常用的用户身份验证的方法:1.用户名密码方式.2.指纹打卡机.3.基于证书验证方法..系统验证用户身份合法,用户方可访问系统的资源. 关键对象 subject:主体,理解为用户,可能是程序,都要去访问系

【shiro】登录经历的流程(执行ShiroAccountRealm doGetAuthenticationInfo经历的过程)

http://jinnianshilongnian.iteye.com/blog/2025656 拦截器机制. 在这里 @Bean(name = "shiroFilter") public ShiroFilterFactoryBean getShiroFilter() { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecu

【Shiro】Apache Shiro架构之自定义realm

之前写的博客里都是使用.ini文件来获取信息的,包括用户信息,角色信息,权限信息等.进入系统时,都是从.ini文件这读取进入的.实际中除非这个系统特别特别简单,否则一般都不是这样干的,这些信息都是需要在数据库中进行维护的,所以就需要用到自定义realm了. 写在前面:这篇博文是基于上一篇Shiro集成web基础之上修改的. 1. 数据库建表 首先在数据库中新建三个表:t_user,t_role和t_permission,分别存储用户信息,角色信息和权限信息,建表语句如下: CREATE TABL

【shiro】UsernamePasswordToken中char[]替代String的安全性

shiro中UsernamePasswordToken类的源码中有一段注释很有意思. * <p>Note that this class stores a password as a char[] instead of a String * (which may seem more logical). This is because Strings are immutable and their * internal value cannot be overwritten - meaning

【Shiro】Apache Shiro架构之集成web

前面两节内容介绍了Shiro中是如何进行身份和权限的认证,但是只是单纯的进行Shiro的验证,简单一点的话,用的是.ini配置文件,也举了个使用jdbc realm的例子,这篇博文主要来总结一下Shiro是如何集成web的,即如何用在web工程中. 写在前面:本文没有使用web框架,比如springmvc或者struts2,用的是原始的servlet,使用的是.ini配置文件,旨在简单粗暴,说明问题.后面会写一些和框架整合的博文. 本文部分参考Apache Shiro的官方文档,文档地址:htt

【shiro】org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token

org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=true] did not match the expected credentials. at org.apache.shiro.realm.AuthenticatingRealm.assert

【Shiro】Apache Shiro架构之身份认证(Authentication)

Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理功能,可为任何应用提供安全保障.本文主要介绍一下Shiro中的身份认证功能,如下: 本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authentication.html. 本文遵循以下流程:先介绍Shiro中的身份认证,再通过一个实例来具体说明一下(基于maven). 1. 认证主体(Authenticating Subjects) Subject 认证主体包