天天看点

shiro与SSM项目整合

<a href="http://download.csdn.net/detail/bug_moving/9738002">shiro于ssm整合所有的jar包</a>

在web系统中,shiro也通过filter进行拦截。filter拦截后将操作权交给spring中配置的filterchain(过虑链儿)

shiro提供很多filter。

shiro与SSM项目整合

在applicationcontext-shiro.xml 中配置web.xml中fitler对应spring容器中的bean。

shiro与SSM项目整合

对静态资源设置逆名访问:

修改applicationcontext-shiro.xml

shiro与SSM项目整合

使用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

shiro与SSM项目整合

在applicationcontext-shiro.xml中配置

shiro与SSM项目整合

不用我们去实现退出,只要去访问一个退出的url(该 url是可以不存在),由logoutfilter拦截住,清除session。

在applicationcontext-shiro.xml配置logoutfilter

shiro与SSM项目整合

使用permissionsauthorizationfilter

在applicationcontext-shiro.xml中配置url所对应的权限。

测试流程:

1、在applicationcontext-shiro.xml中配置filter规则

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缓存来解决。

过滤器简称 对应的java类

数据库中存储到的md5的散列值,在realm中需要设置数据库中的散列值它使用散列算法 及散列次数,让shiro进行散列对比时和原始数据库中的散列值使用的算法 一致。

shiro与SSM项目整合

修改realm的dogetauthorizationinfo,从数据库查询权限信息。

使用注解式授权方法。

使用jsp标签授权方法。

对系统中类的方法给用户授权,建议在controller层进行方法授权。

在springmvc.xml中配置

shiro与SSM项目整合
shiro与SSM项目整合

jsp页面添加:

标签名称 标签条件(均是显示标签内容)

修改itemslist.jsp页面

shiro与SSM项目整合

当调用controller的一个方法,由于该 方法加了@requirespermissions(“item:query”) ,shiro调用realm获取数据库中的权限信息,看”item:query”是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。

当展示一个jsp页面时,页面中如果遇到<code>&lt;shiro:haspermission name="item:update"&gt;</code>,shiro调用realm获取数据库中的权限信息,看item:update是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。

问题:只要遇到注解或jsp标签的授权,都会调用realm方法查询数据库,需要使用缓存解决此问题。