2024年6月14日发(作者:)

shiro认证时拦截器的isAccessAllowed和

onAccessDenied执行流程

1. 拦截器的isAccessAllowed方法执行流程:

首先,当用户请求访问一些资源时,shiro会通过过滤器链将请求传

递到拦截器中。拦截器首先会判断当前用户是否已经通过认证,如果用户

已经通过认证,则直接返回true,并允许用户访问资源。这是因为在认

证通过后,shiro会将用户信息保存在Subject对象中,拦截器可以通过

该对象获取当前用户的认证信息。

如果用户还未通过认证,则拦截器会进一步判断当前请求是否需要进

行认证。这一步是通过调用Subject对象的isAuthenticated方法来判断

的。如果返回true,则表示当前请求需要进行认证,拦截器会将控制权

交给shiro的认证器进行处理,并返回false。认证器会根据配置的

Realm对象进行具体的认证操作,例如验证用户名和密码。

如果返回false,则表示当前请求不需要进行认证,拦截器会直接返

回true,并允许用户访问资源。这种情况通常用于设置一些公开资源,

例如网站首页等,不需要进行用户认证。

2. 拦截器的onAccessDenied方法执行流程:

当拦截器的isAccessAllowed方法返回false时,表明当前请求需要

进行认证。此时,拦截器会进入onAccessDenied方法的执行流程。

首先,拦截器会获取到当前的Subject对象,并将请求的相对路径保

存在session中。这是为了在用户认证通过后,可以重定向到该请求的页

面。

然后,拦截器会判断当前请求是否为POST请求。如果是POST请求,

拦截器会将当前请求的页面路径保存在session中。这是因为在不同的认

证方式下,shiro会分别处理GET请求和POST请求,POST请求一般用于

提交用户的认证信息(例如用户名和密码),而GET请求用于显示登录页

面。

接下来,拦截器会执行shiro的登录方法,该方法会根据配置的认证

器进行具体的认证操作。认证器会根据用户提交的认证信息进行认证,并

返回认证结果。

如果认证成功,拦截器会获取用户请求的相对路径,从session中取

出,并将请求重定向到该路径。重定向操作可以通过shiro提供的工具类

进行处理。

如果认证失败,拦截器会将请求转发到登录页面,并返回false,不

允许用户访问资源。

总结:

通过isAccessAllowed和onAccessDenied方法,拦截器可以完成用

户访问权限的控制。isAccessAllowed方法用于判断当前用户是否可以访

问该资源,如果可以,则返回true;否则,返回false,并执行

onAccessDenied方法。onAccessDenied方法用于处理用户认证操作,并

根据认证结果进行相应的页面跳转。