web.xml中配置shiro的filter
 在web系统中,shiro也通过filter进行拦截。filter拦截后将操作权交给spring中配置的filterChain(过虑链儿) 
 shiro提供很多filter。
 
applicationContext-shiro.xml
在applicationContext-shiro.xml 中配置web.xml中fitler对应spring容器中的bean。
 
静态资源
 对静态资源设置逆名访问: 
 修改applicationContext-shiro.xml
 
登陆
原理
使用FormAuthenticationFilter过虑器实现 ,原理如下:
 将用户没有认证时,请求loginurl进行认证,用户身份和用户密码提交数据到loginurl 
 FormAuthenticationFilter拦截住取出request中的username和password(两个参数名称是可以配置的) 
 FormAuthenticationFilter调用realm传入一个token(username和password) 
 realm认证时根据username查询用户信息(在Activeuser中存储,包括 userid、usercode、username、menus)。 
 如果查询不到,realm返回null,FormAuthenticationFilter向request域中填充一个参数(记录了异常信息)
在登录页面中,由于FormAuthenticationFilter的用户身份和密码的input的默认值(username和password),修改页面的账号和密码 的input的名称为username和password
 
认证拦截过虑器
在applicationContext-shiro.xml中配置
 
退出
使用LogoutFilter
不用我们去实现退出,只要去访问一个退出的url(该 url是可以不存在),由LogoutFilter拦截住,清除session。
在applicationContext-shiro.xml配置LogoutFilter
 
授权过虑器测试
使用PermissionsAuthorizationFilter
在applicationContext-shiro.xml中配置url所对应的权限。
 测试流程: 
 1、在applicationContext-shiro.xml中配置filter规则
<!--商品查询需要商品查询权限 -->
    /items/queryItems.action = perms[item:query] - 1
 - 2
 
- 1
 - 2
 
 2、用户在认证通过后,请求/items/queryItems.action 
 3、被PermissionsAuthorizationFilter拦截,发现需要“item:query”权限 
 4、PermissionsAuthorizationFilter调用realm中的doGetAuthorizationInfo获取数据库中正确的权限 
 5、PermissionsAuthorizationFilter对item:query 和从realm中获取权限进行对比,如果“item:query”在realm返回的权限列表中,授权通过。
问题总结
1、在applicationContext-shiro.xml中配置过虑器链接,需要将全部的url和权限对应起来进行配置,比较发麻不方便使用。
2、每次授权都需要调用realm查询数据库,对于系统性能有很大影响,可以通过shiro缓存来解决。
shiro的过虑器
过滤器简称 对应的Java类
anon    org.apache.shiro.web.filter.authc.AnonymousFilter
authc   org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic      org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
perms   org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
port    org.apache.shiro.web.filter.authz.PortFilter
rest    org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
roles   org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
ssl org.apache.shiro.web.filter.authz.SslFilter
user    org.apache.shiro.web.filter.authc.UserFilter
logout  org.apache.shiro.web.filter.authc.LogoutFilter
anon:例子/admins/**=anon 没有参数,表示可以匿名使用。
authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,FormAuthenticationFilter是表单认证,没有参数 
perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
user:例如/admins/user/**=user没有参数表示必须存在用户, 身份认证通过或通过记住我认证通过的可以访问,当登入操作时不做检查
  认证
设置凭证匹配器
数据库中存储到的md5的散列值,在realm中需要设置数据库中的散列值它使用散列算法 及散列次数,让shiro进行散列对比时和原始数据库中的散列值使用的算法 一致。
 
授权
 修改realm的doGetAuthorizationInfo,从数据库查询权限信息。 
 使用注解式授权方法。 
 使用jsp标签授权方法。
开启controller类aop支持
对系统中类的方法给用户授权,建议在controller层进行方法授权。
在springmvc.xml中配置
 
在controller方法中添加注解
 
jsp标签 授权
Jsp页面添加:
<%@ tagliburi="http://shiro.apache.org/tags" prefix="shiro" %> - 1
 
- 1
 
标签名称 标签条件(均是显示标签内容)
<shiro:authenticated>   登录之后
<shiro:notAuthenticated>    不在登录状态时
<shiro:guest>   用户在没有RememberMe时
<shiro:user>    用户在RememberMe时
<shiro:hasAnyRoles name="abc,123" > 在有abc或者123角色时
<shiro:hasRole name="abc">  拥有角色abc
<shiro:lacksRole name="abc">    没有角色abc
<shiro:hasPermission name="abc">    拥有权限资源abc
<shiro:lacksPermission name="abc">  没有abc权限资源
<shiro:principal>   显示用户身份名称
 <shiro:principal property="username"/>     显示用户身份中的属性值 - 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 
修改itemsList.jsp页面
 
授权测试
当调用controller的一个方法,由于该 方法加了@RequiresPermissions(“item:query”) ,shiro调用realm获取数据库中的权限信息,看”item:query”是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。
 当展示一个jsp页面时,页面中如果遇到<shiro:hasPermission name="item:update">,shiro调用realm获取数据库中的权限信息,看item:update是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。
问题:只要遇到注解或jsp标签的授权,都会调用realm方法查询数据库,需要使用缓存解决此问题。

京公网安备 11010502036488号