为了深入理解Shiro与web项目集成的工作原理,我们搭建一个普通的web项目
1. 导入相关依赖
pom.xml: shiro-core和shiro-web
1 | <properties> |
2.在web.xml中配置shiro的过滤器shiroFilter
1 | <web-app...> |
具体可以参考:官方文档
这里简单说下EnvironmentLoaderListener和ShiroFilter的作用:
- 在容器启动时创建 WebEnvironment 对象,并由该对象来读取 Shiro 配置文件,创建WebSecurityManager 与 FilterChainResolver 对象,它们都在后面将要出现的 ShiroFilter 中起到了重要作用。
- 从 web.xml 中同样可以得知,ShiroFilter 是整个 Shiro 框架的门面,因为它拦截了所有的请求,后面是需要 Authentication(认证)还是需要 Authorization(授权)都由它说了算。
3. 创建shiro.ini文件
1 | [main] |
上面配置中的anon,authc,logout..等等都是shiro中的默认过滤器,官方文档:默认过滤器,下面列举了一些常用的默认过滤器:
1 | 过滤器简称 对应的java类 |
说明:
anon:匿名拦截器,即不需要登录即可访问;一般用于静态资源过滤;示例“/static/**=anon”authc:表示需要认证(登录)才能使用;示例“/**=authc”.主要属性:usernameParam:表单提交的用户名参数名( username); passwordParam:表单提交的密码参数名(password); rememberMeParam:表单提交的密码参数名(rememberMe); loginUrl:登录页面地址(/login.jsp);successUrl:登录成功后的默认重定向地址; failureKeyAttribute:登录失败后错误信息存储key(shiroLoginFailure);authcBasic:Basic HTTP身份验证拦截器,主要属性: applicationName:弹出登录框显示的信息(application);roles:角色授权拦截器,验证用户是否拥有资源角色;示例“/admin/**=roles[admin]”perms:权限授权拦截器,验证用户是否拥有资源权限;示例“/user/create=perms[“user:create”]”user:用户拦截器,用户已经身份验证/记住我登录的都可;示例“/index=user”logout:退出拦截器,主要属性:redirectUrl:退出成功后重定向的地址(/);示例“/logout=logout”port:端口拦截器,主要属性:port(80):可以通过的端口;示例“/test= port[80]”,如果用户访问该页面是非80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样rest:rest风格拦截器,自动根据请求方法构建权限字符串(GET=read,POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create)构建权限字符串; 示例“/users=rest[user]”,会自动拼出“user:read,user:create,user:update,user:delete”权限字符串进行权限匹配(所有都得匹配,isPermittedAll);ssl:SSL拦截器,只有请求协议是https才能通过;否则自动跳转会https端口(443);其他和port拦截器一样;
注:
anon,authcBasic,auchc,user是认证过滤器,
perms,roles,ssl,rest,port是授权过滤器
4.拦截器的执行原理

从上图可以看出,排号越前的默认拦截器优先级越高
4.1 authc登录拦截器工作原理
authc拦截器有2个作用:
校验是否已经登录
请求进来时,拦截并判断当前用户是否登录了,如果已经登录了放行, 如果没有登录,跳转到authc.loginUrl属性配置的路径,注意:默认是/login.jsp
执行登录认证
请求进来时,如果请求的路径为authc.loginUrl属性配置的路径(没配置,默认是/login.jsp)时,如果当前用户没有登录,authc这个拦截器会尝试获取请求中的账号跟密码值,然后比对ini配置文件或者realm中的用户列表,如果比对正确,直接执行登录操作,反之,抛异常,跳转到authc.loginUrl指定的路径。
注意:请求中账号与密码必须固定为username 跟password, 如果需要改动必须额外指定,authc.usernameParam=xxx authc.passwordParam=xxxx
我们在
shiro.ini文件中已经配置了user,shiro的拦截器会自动进行校验,不需要再像传统方式一样在这里获取用户名和密码,然后比对,然后存入session….
4.2 authc登录成功之后处理逻辑:

4.3 authc登录失败后的异常处理:
1 | (name = "LoginServlet", urlPatterns = "/login") |
5.shiro的jsp标签
1 | 标签名称 标签条件(均是显示标签内容) |
当具有对department资源的add权限的时候,才显示新增标签
1 | <shiro:hasPermission name="department:add"> |
上面就是shiro和web矿建的简单集成…