一、简介
Shiro与Web集成,主要是通过配置一个ShiroFilter拦截所有URL,其中ShiroFilter类似于如Struct2/SpringMvc这种web框架的前端控制器,是所有请求的入口点,负责根据配置(如ini配置文件),判断请求进入URL是否需要登录/权限等工作。
请求会经过ShiroFilter过滤,ShiroFilter会去加载ini文件进行认证和权限校验。如果没有相应的,那么就返回对应的提示。
其中对请求进行以特定规则拦截最重要的就是配置拦截器
二、拦截器
我们通过上面的表格可以轻松的分别每一种拦截器的优先级,这样假设某个资源访问同时设置了两个或者多个拦截器,我们可以清楚的知道拦截器的执行顺序,从而方便我们进行一些操作.
更加具体的拦截器执行顺序图例:
如上,我们在ini文件中配置了一个[urls],在里面,我们定制了请求路径对应会应用哪些拦截器,如:
- 当用户请求
/static/
开头的所有路径的时候,默认使用的就是匿名拦截器,不用做任何的拦截过滤操作就放行。 - 当请求
/employee , /department ,/orderBill
的时候,首先必须要判断是否登录果过(authc登录拦截器的处理),然后再去判断是否存在某个角色(roles中的[]指定角色名字),再去判断是否对资源有某个权限(perms中的[]指定资源权限)。 - 当请求/loginOut的时候,表示的就是注销登出,这个操作就会对应到清除用户的缓存session,然后退出之后默认会重定向(redirect)回/
- 剩下的所有的请求/** 将会被要求必须登录authc后才可以进行访问
其中上面的[main]模块的讲解:
authc.loginUrl
表达的含义是,登录认证跳转到的urlroles.unauthorizedUrl
用户没有包含页面请求路径所需要的角色,那么就会跳转到的页面。perms.unauthorizedUrl
用户没有包含页面请求路径所需要拥有对某个资源的操作权限时,那么就会跳转到的页面。logout.redirectUrl
登出之后,重定向的页面。
shiro所有过滤器的操作都会按照过滤规则依次的进行执行!
三、authc登录拦截器的工作原理
有两个作用
- 登录认证
请求进来时,拦截判断当前用户是否登录了,如果已经登录了就放行,如果没有登录,跳转到authc.loginUrl
属性配置的路径,注意:默认是/login.jsp - 执行登录认证
请求进来时,如果请求的路径为authc.loginUrl
属性配置的路径(没配置,默认是/login.jsp
)时如果当前用户没有登录,authc这个拦截器会尝试获取请求中的账号和密码,然后比对ini配置文件或者realm中的用户列表,如果对比正确,直接执行登录操作,否之,抛出异常,跳转到authc.loginUrl指定的路径
注意请求中的账号和密码的name必须固定为username和password,如果要改动必须额外指定。
authc.usernameParam=xxx
authc.passwordParam=xxx
authc登录成功后的处理操作
authc登录失败后的处理操作
登录失败将会跳转到authc.loginUrl
指定的路径,然后执行里面的方法。并将异常信息返回到指定的页面。如下:
其中shiroLoginFailure存放着异常的名字