shiro与SSM项目整合

shiro于SSM整合所有的jar包

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]

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" %>

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

<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"/>     显示用户身份中的属性值

修改itemsList.jsp页面

授权测试

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

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

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

时间: 2024-10-31 11:22:51

shiro与SSM项目整合的相关文章

pmp学习3——项目整合管理

项目整合管理包括 识别.定义.组合.统一与协调项目管理过程组的各过程及项目管理活动而进行的各种过程和活动.在项目管理中,"整合"兼具统一.合并.连接和一体化的性质,对完成项目.成功管理干系人期望和满足项目要求,都至关重要. 下面抱过了项目整合管理的各个过程: 1.制定项目章程: 制定一份正式批准项目或阶段的文件,并记录能反映干系人需要和期望的初步要求的过程. 2.制定项目管理计划:对定义.编制.整合和协调所偶子计划所必须的行动进行记录的过程. 3.知道与管理项目执行:为实现项目目标而执

求助,在线等,java+ssm项目初始化数据问题解析json文件加载到数据库,跪谢!

问题描述 求助,在线等,java+ssm项目初始化数据问题解析json文件加载到数据库,跪谢! 服务器能不能在启动的时候加载json文件 然后把数据 加载到数据库!就是启动服务器,然后启动成功后,数据库要看到有基本数据的效果,可以实现吗?在线等!跪谢!

eclipse运行maven+ssm项目中报错。

问题描述 eclipse运行maven+ssm项目中报错. 四月 18, 2016 5:37:15 下午 org.springframework.context.support.AbstractApplicationContext refresh 警告: Exception encountered during context initialization - cancelling refresh attempt org.springframework.beans.factory.BeanCre

j2ee-关于J2EE项目整合GIS功能的问题

问题描述 关于J2EE项目整合GIS功能的问题 一个电子政务系统,需要将某些建筑的信息加载到地图上,然后可以在地图上进行查询功能,主要作用是用来展示信息. 初步考虑到是直接用在线地图(百度.天地图),然后从数据库中读坐标,然后在加载地图的时候,直接在地图上标记处点,然后单击的时候,出现信息提示框,数据库就用普通的关系型数据库,存放x坐标.y坐标.关联ID. 那么问题来了: 其一,如果把地图缩放到很大,然后地图上的点就太多了,加载起应该会很慢. 其二就是做搜索的时候,怎么选取符合点. 真正让我纠结

android-把两个不同的安卓项目整合到一起。弄成一个安装包,并且具有两个项目的功能。

问题描述 把两个不同的安卓项目整合到一起.弄成一个安装包,并且具有两个项目的功能. 我手里有两个安卓项目so和TestRotateAnim,我想在so项目上有一个按钮,一点击就跳转到TestRotateAnim这个项目上.话不多说直接上图. 解决方案 用广播完全可以实现,在图片的项目中注册广播,在按钮的项目中发送广播啊,点击的时候发送广播. 这是我最近了解的希望对你有用,不会的话可以来问我 解决方案二: 为什么只传上来一张图 解决方案三: 解决方案四: 你干脆直接新建一个activity,然后直

【PMP】Head First PMP 学习笔记 第四章 项目整合管理

第四章 项目整合管理 项目经理每天的工作 力保项目顺利进行 紧密监督以确保计划进行 计划本身不完善需要予以修正 即使是更大的项目的子项目,也要有收尾的过程 6个整合管理过程 整合管理划分为6个过程,项目经理必须掌握的核心职责. 1.制订项目章程 授权你展开工作的文档,通常由赞助人(为项目提供资金的人)交给你. 2.制订项目管理计划 项目管理计划涵盖了所有知识领域,很大一部分就是告诉你在出现问题时如何处理变更. 3.指导和管理项目执行 确保所有人都在做他们本该做的事,项目创建的产品和项目确实满足干

【PMP认证考试之个人总结】第 3 章 项目整合管理

第 3章 项目整合管理 <PMP个人备考笔记(全篇)>下载 3.1 综述   何时任命PM ? ①最好时机 ===>制定项目章程时(因为项目章程最好由PM编制,但需要高层审批) ②最晚时间 ===>规划开始前 3.2 制定项目章程   1.关于"项目章程"的考点: ①编写最好是PM,但是必须要高层审批: ②标志项目正式启动,PM正式授权: ③不应用合同作为项目章程: ④主要内容(12个方面) 不包括: ①指定的资源: ②固定的完工日期: ③定量的风险分析: ④项

如何将activity项目整合到fragment下

问题描述 如何将activity项目整合到fragment下 我用fragment做了一个滑屏,另外我又做了一个新的项目,我想将这个新的项目放到其中的一页,求各位大神指教. 解决方案 可以放进去啊...Fragment 就是一个activity...你在oncreate 那个地方初始化布局,其余的和activity一样处理就行了

跪求《实战突击 Java Web项目整合开发》的光盘

问题描述 跪求<实战突击 Java Web项目整合开发>的光盘 解决方案 <实战突击:Java Web项目整合开发>简介及源码 解决方案二: fsd hnf a 肚子上的撒 吧广东省不错vfgxcgcbcb 高兴股份感到vcbc部分 解决方案三: fsd hnf a 肚子上的撒 吧广东省不错vfgxcgcbcb 高兴股份感到vcbc部分