shirossm整合shirosm,事务怎么配置

springmvc SSM 多数据源 shiro redis 后台框架 整合
来源:博客园
A集成代码生成器 [正反双向(单表、主表、明细表、树形表,开发利器)+快速构建表单freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面、建表sql脚本,处理类,service等完整模块B 集成阿里巴巴数据库连接池
数据库连接池
阿里巴巴的 druid。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势C 集成安全权限框架
Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权,更安全,更可靠D 集成ehcache 分布式缓存 ;
是一个纯Java的进程内缓存框架,具有快速、精干等特点,广泛使用的开源Java分布式缓存。E 集成微信接口开发;
F 图片爬虫技术;
SQL 编辑器, 支持复杂sql语句,生成报表,可以导出excel多数据源(支持同时连接无数个数据库,可以不同的模块连接不同数的据库)1. 模块化、服务化,流程化,耦合度低、扩展性好,灵活度高,工具类封装完整,干净利索,调用简单方便2. 提供Rest服务,支持APP手机应用(android和ios)接口、php、.net、易语言、VB等第三方接口调用3. 全新高大尚HTML5+css3.0+bootstrap响应式开发界面UI,( 手机 PC 平板 截图在下面)、前沿.
spring restful 风格4. 框架搭建完善成熟,在此基础上做过很多项目,系统具有并发处理、分布式、稳定性。5. 系统功能完善,此为框架平台,文档、注释齐全,提供技术支持,专门供二次开发6. 在此基础上可二次开发(OA、ERP、CRM ,医疗管理、金融、网站后台、APP后台、电子商务、商城(赠送UI)等等7.我们这边是公司,主要业务是定制开发,
此系统为我们平时给客户做项目用的,经过很多项目实战考-------------------------------------------------------------------------------------------------------------------------系统模块1.
权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限
角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限。
按钮权限: 给角色分配按钮权限。2.
按钮管理:自定义按钮管理,维护按钮权限标识等3.
菜单管理:无限级别自定义菜单,自定义菜单图标,业务菜单和系统菜单分离,菜单状态显示隐藏4.
数据字典:无限级别,支持多级别无限分类。内设编号,排序等5.
组织机构:无限级别,公司or部门管理6.
在线管理:websocket技术,实时检测在线用户列表,统计在线人数,可强制用户下线 同一用户只能在一个客户端登录7.
系统用户:对各个基本的用户增删改查,单发、群发站内信邮件短信,导入导出excel表格,批量删除8.
会员管理:对前台用户管理,分配会员级别,到期时间,状态,联系信息等资料9.
代码生成:生成完整的模块代码,并保留生成记录模版,可复用
生成完整的模块,页面、处理类、service层、myabaits的xml 建表的sql脚本等
任意连接其它数据库(mysql、oracle、sqlserver),根据表反射生成本系统的模块10. 性能监控:监控整个系统的性能,SQL监控,SQL防火墙,URL监控,SPRING监控,SESSION监控等11. 接口测试:POST or GET 方式检测系统接口,参数加密,json返回结果,计算服务器响应时间12. 发送邮件:单发,群发邮件
13. 置二维码:生成二维码图表保存到服务器 or
解析读取二维码内信息 14. 图表报表:柱状图、饼状图、折线图、各种图表大全15. 地图工具:打开地图, 鼠标点击地图某位置获取经纬度坐标,根据经纬度计算两点距离16. 打印测试:页面打印预览测试17. 图片管理:对批量上传的图片统一管理 ,点击放大,可打开多个,自由切换,绚丽预览效果18. 图片爬虫:输入某网址,爬出其图片显示在页面上,可以放大预览。可保存到服务器上,到图片管理里面19. 站内信:收信箱和发信箱, websocket技术通讯技术做的及时收信提醒,可配置语音提示来信20. 系统设置:修改系统名称,邮件服务器配置,短信账号设置,图片水印配置,微信配置21. 及时聊天:打开聊天窗口,可群聊、一对一聊天22. 表单构建:拖拽式快速自定义构建表单,组建元素丰富,有富文本、上传控件、下拉框等等--------------------------------------------------------------------------------------------------------------信息模块(小项目代码中)新闻管理:新闻的维护、发布、权重排序等 采用百度ueditor富文本框公告管理:公告的维护、发布广告管理:广告的维护、发布,状态维护,上传广告图片友情链接:友情链接的维护、状态维护特别推荐:特别推荐、状态维护微信模块
(有指导视频
花生壳本地IP映射操作)关注回复:微信用户关注公众号回复文本回复:匹配关键词进行文本回复图文回复:匹配关键词进行图文回复应用命令:匹配关键词进行命令操作,例如微信发送命令,执行服务器重启、关机、锁定等操作-------------------------------------------------------------------------------------------------------------------------技术点1. 导出 导入 excel 文件2
导出word文件3. IO 流上传下载文件4. 群发邮件,可以发html、纯文本格式,可以发给任意邮箱(实现批量发送广告邮件)5. 群发or单独 发送短信,支持两种第三方短信商接口6. spring
事物处理7. 代码生成器 (freemarker), 代码 zip 压缩打包8. MD5加密 SHA加密(登录密码用此加密)接口加密身份校验9. 数据库连接池
阿里的 druid。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势,支持并发10.加入安全框架 shiro (登录授权)(session管理)11.根据汉字 解析汉字的全拼(拼音)和首字母(导入excel到用户表,根据用户的汉字姓名生成拼音的用户名)12.app接口@ResponseBody(支持与其它语言数据交互)13.极光推送 (推送给APP及时消息,APP不启动也能收到)14.微信接口(身份验证,文本、图文回复等) 微信远程控制服务器重启、锁定、其它应用程序15.java Quartz2.2 任务调度16.java websocket 即时通讯技术,点对点,群聊,单聊17.新增Lucene全文检索18.Base64传输图片19.图片加水印(图片水印,文字水印)20.生成 or
解析 二维码21.HTML5 + JAVAEE
WebSocket 通信技术,WebSocket 验证用户登录,强制某用户下线22.批量异步上传图片,可预览,有进度条,支持拖拽上传(百度webuploader )。列表动态滑动放大展示。23.ehcache 自定义二级缓存 ,选择缓存存放目录,处理并发,增加系统性能24.服务器内部GET POST 请求25.uploadify 上传插件,单条、批量上传多线程,带进度条,异步,图片、视频, 其它文件格式均可上传26.地图选点获取经纬度坐标,根据俩经纬度计算距离27.tab标签页面功能,标签自由切换,不重复操作数据库28.站内信语音提醒,js控制音频播放29.百度富文本编辑器,可上传图片30.网页爬虫技术,可根据网页地址爬取图片和网页标题等信息(爬取某商城图片保存本服务器)系统演示视频:
(视频一)土豆
链接: 密码:xh7w
百度云 (视频一)链接: 密码:nxw0
百度云 (视频二)PC实物截图如下登录界面背景用HTML5特效自动切换(百叶窗,幕布等多种切换方式)
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动SSM + Shiro 整合(4)- 在 Web 项目中添加 Shiro - CSDN博客
SSM + Shiro 整合(4)- 在 Web 项目中添加 Shiro
项目源码:
演示地址:
SSM + Shiro 整合 (4)- 在 Web 项目中添加 Shiro
本节的目标是整合 Shiro。
步骤1:添加依赖
&org.apache.shiro&
&shiro-core&
&${shiro.version}&
&org.apache.shiro&
&shiro-web&
&${shiro.version}&
步骤2:添加配置文件 shiro.ini
(说明:下面的这个配置是全部写好的配置,请大家要明白每一行配置的意思,一点一点添加完成功能上的测试)
# 声明一个密码匹配器
credentialsMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
# 设置该密码匹配器使用的算法是 md5
credentialsMatcher.hashAlgorithmName=md5
# 声明一个自定义的 Realm
myRealm = com.liwei.shiro.realm.MyRealm
# 将上面声明的密码匹配器注入到自定义 Realm 的属性中去
myRealm.credentialsMatcher=$credentialsMatcher
# 自定义一个权限匹配器
permissionResolver=com.liwei.shiro.permission.UrlPermissionResolver
# 将自定义的权限匹配器注入到自定义 Realm 中
myRealm.permissionResolver = $permissionResolver
# 设置安全管理器的安全数据源为自定义的 Realm
securityManager.realms=$myRealm
# 如果认证不通过,浏览器通过 Get 方式请求到 /login 上
authc.loginUrl=/login
# 声明一个自定义的过滤器
resourceCheckFilter = com.liwei.shiro.filter.ResourceCheckFilter
# 为上面声明的自定义过滤器注入属性值
resourceCheckFilter.errorUrl=/unAuthorization
# 配置 url 与使用的过滤器之间的关系
总结:在没有使用 Spring 整合 Shiro 的时候,我们在 web.xml 里面配置监听器和过滤器。整合 Spring 的时候,我们应该在 web.xml 里面配置一个代理。
单纯的 web 应用使用的是 shiro.int 来实例化 Shiro 的各个组件,如果我们使用 Spring 的话,就要使用 Spring 的 Bean 文件了,这样 shiro.ini 文件就要转换成 Spring 的 Bean 文件。
配置与 Spring 的整合,就要添加 Spring 的依赖。
&org.apache.shiro&
&shiro-spring&
&${shiro.version}&
步骤3:在 web.xml 中添加
&org.apache.shiro.web.env.EnvironmentLoaderListener&
&ShiroFilter&
&org.apache.shiro.web.servlet.ShiroFilter&
&ShiroFilter&
步骤4:编写自定义 Realm
public class MyRealm extends AuthorizingRealm {
@Autowired
private IUserService userS
private static final Logger logger = LoggerFactory.getLogger(MyRealm.class);
* principalCollection
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
("--- MyRealm doGetAuthorizationInfo ---");
User user = (User)principalCollection.getPrimaryPrincipal();
Integer userId = user.getId();
List&Resource& resourceList = userService.listAllResource(userId);
List&String& roleSnList = userService.listRoleSnByUser(userId);
List&String& resStrList = new ArrayList&&();
for(Resource resource:resourceList){
resStrList.add(resource.getUrl());
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setRoles(new HashSet&&(roleSnList));
info.setStringPermissions(new HashSet&&(resStrList));
logger.debug("role =& " + roleSnList);
logger.debug("permission =& " + resStrList);
* authenticationToken
* AuthenticationException
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
("--- MyRealm doGetAuthenticationInfo ---");
String username = authenticationToken.getPrincipal().toString();
User user = userService.loadByUsername(username);
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),getName());
info.setCredentialsSalt(ByteSource.Util.bytes(username.getBytes()));
步骤5:编写登录的方法
@RequestMapping(value = "/")
@Controller
public class LoginController {
private static final Logger logger = LoggerFactory.getLogger(LoginController.class);
@RequestMapping(value = "/login",method = RequestMethod.GET)
public String login(){
return "login";
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(User user, Model model){
String username = user.getUsername();
String password = user.getPassword();
logger.debug("username =& " + username);
logger.debug("password =& " + password);
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
Subject subject = SecurityUtils.getSubject();
String msg = null;
subject.login(token);
} catch (UnknownAccountException e) {
e.printStackTrace();
msg = e.getMessage();
} catch (IncorrectCredentialsException e){
e.printStackTrace();
msg = e.getMessage();
if(msg == null){
return "redirect:/admin/user/list";
model.addAttribute("msg",msg);
return "login";
@RequestMapping(value = "/logout",method = RequestMethod.GET)
public String logout(Model model){
Subject subject = SecurityUtils.getSubject();
subject.logout();
model.addAttribute("msg","您已经退出登录");
return "login";
@RequestMapping(value = "/unAuthorization")
public String unAuthorization(){
return "unAuthorization";
本文已收录于以下专栏:
相关文章推荐
shiro于SSM整合所有的jar包web.xml中配置shiro的filter在web系统中,shiro也通过filter进行拦截。filter拦截后将操作权交给spring中配置的filterCh...
shiro-springmvc权限控制
本节的目标是在项目中添加 Spring MVC 的支持。
步骤1 :添加 Maven 的 依赖和 web 目录,编写 web.xml 部署描述符。
org.springframework
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)SSM框架的搭建就不在叙述了
本文主要是讲解在SSM基础上再加上ehcache
1:首先:pom.xml需要的jar
&dependency&
&groupId&org.mybatis&/groupId&
&artifactId&mybatis-ehcache&/artifactId&
&version&1.0.0&/version&
&/dependency&
&dependency&
&groupId&org.ehcache&/groupId&
&artifactId&ehcache&/artifactId&
&version&3.0.1&/version&
&/dependency&
2:在src/main/resources中添加ehcache.xml的配置文件,该路径跟随你的框架而定(大家都懂的)
&?xml version="1.0" encoding="UTF-8"?&
&ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false"&
&diskStore path="java.io.tmpdir" /&
&defaultCache eternal="false" maxElementsInMemory="1000"
overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" /&
&cache name="testCache" eternal="false" maxElementsInMemory="100"
overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU" /&
&/ehcache&
&!-- 这里是说明name:Cache的唯一标识
maxElementsInMemory:内存中最大缓存对象数
maxElementsOnDisk:磁盘中最大缓存对象数,若是0表示无穷大
eternal:Element是否永久有效,一但设置了,timeout将不起作用
overflowToDisk:配置此属性,当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中
timeToIdleSeconds:设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds:设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用,默认是0.,也就是element存活时间无穷大
diskPersistent:是否缓存虚拟机重启期数据
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用) --&
3:在spring-mybatis.xml中假如encache的配置
&!-- 使用ehcache缓存 --&
&bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"&
&property name="configLocation" value="classpath:ehcache.xml" /&
--------重点来了---------
假如你的框架里面集成了shiro,这里就需要变下了,具体配置如下
&!-- MyBatis使用ehcache缓存 start --&
&bean id="ehCacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"&
&property name="configLocation" value="classpath:ehcache.xml" /&
&property name="shared" value="true"&&/property& &!-- 这里是关键!!!没有必错
&!-- end MyBatis使用ehcache缓存 --&
&!-- 缓存管理器 使用Ehcache实现 --&
&bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"&
&property name="cacheManager" ref="ehCacheManager" /&
4:最后在你的mapper.xml中配置encache,加入以下配置
&cache type="org.mybatis.caches.ehcache.LoggingEhcache" &
&property name="timeToIdleSeconds" value="3600"/&
&property name="timeToLiveSeconds" value="3600"/&
&property name="maxEntriesLocalHeap" value="1000"/&
&property name="maxEntriesLocalDisk" value=""/&
&property name="memoryStoreEvictionPolicy" value="LRU"/&
这里说明下,LoggingEhcache &这个会在打印log,如果不像要log的话可以使用EhcacheCache&
最后说明下,按照我这样配置的话,这个mapper.xml里面的操作是全局,默认为useCache="true" &都会有作用,
假如某个业务是不要缓存的,可以在当前业务下加上useCache="false"
&select id="selectByName" resultMap="BaseResultMap" parameterType="java.lang.String" useCache="false"&
---------本博文为博主根据互联网资料加上自己实际应用原创,可以转载但需说明出处--------
阅读(...) 评论()shiro 瞅完就会用(ssm+shiro) - 简书
shiro 瞅完就会用(ssm+shiro)
一 shiro 是什么
shiro 是一个功能强大和易于使用的Java安全框架,为开发人员提供一个直观而全面的解决方案的认证,授权,加密,会话管理。
二 shiro 能干什么
shiro 四个主要的功能
Authentication:身份认证/登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,判断某个已经认证过的用户是否拥有某些权限访问某些资源,一般授权会有角色授权和权限授权;
SessionManager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的,web 环境中作用是和 HttpSession 是一样的;
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
shiro 的其它几个特点
Web Support:Web支持,可以非常容易的集成到Web环境;
Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing:提供测试支持;
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
三 shiro 架构
从图中我们可以看到不管是任何请求都会经过 SecurityManager 拦截并进行相应的处理,shiro 几乎所有的功能都是由 SecurityManager 来管理。其中:
Subject:主体,相当与是请求过来的"用户"
SecurityManager: 是 Shiro 的心脏;所有具体的交互都通过 SecurityManager 进行拦截并控制;它管理着所有 Subject、且负责进行认证和授权、及会话、缓存的管理
Authenticator:认证器,负责主体认证的,即确定用户是否登录成功,我们可以使用  Shiro 提供的方法来认证,有可以自定义去实现,自己判断什么时候算是用户登录成功
Authrizer:授权器,即权限授权,给 Subject 分配权限,以此很好的控制用户可访问的资源
Realm:一般我们都需要去实现自己的 Realm
,可以有1个或多个 Realm,即当我们进行登录认证时所获取的安全数据来源(帐号/密码)
SessionManager:为了可以在不同的环境下使用 session 功能,shiro 实现了自己的 sessionManager ,可以用在非 web 环境下和分布式环境下使用
SessionDAO:对 session 的 CURD 操作
CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;
Cryptography:密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密的。
四 shiro 的主要功能 - 身份认证
1 Subject 认证
身份认证就是在应用中谁能证明他就是他本人,一般会使用用户名和密码作为认证信息。
2 Subject 认证主体
Subject 认证主体包含两个信息:
Principals:身份,即用户名
Credentials:凭证,即密码
3 认证流程
用户发送请求进行 Subject 认证(调用 subject.login(token))
SecurityManager 会去 Authenticator(认证器)中查找相应的 Realms(可能不止一个)源
Realms 可以根据不同类型的 Realm 中去查找用户信息,并进行判断是否认证成功
4 快速搭建 helloWorld
&dependencies&
&dependency&
&groupId&org.apache.shiro&/groupId&
&artifactId&shiro-core&/artifactId&
&version&1.2.4&/version&
&/dependency&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&slf4j-log4j12&/artifactId&
&version&1.7.12&/version&
&/dependency&
&/dependencies&
2) 创建 Realm /resources/shiro.ini
acey=123456
3) 进行身份验证
public class HelloWorld {
public static void main(String[] args) {
加载配置文件,初始化 SecurityManager 工厂
Factory&SecurityManager& factory = new IniSecurityManagerFactory
("classpath:shiro.shiro.ini");
获取 SecurityManager 实例
SecurityManager securityManager = factory.getInstance();
把 SecurityManager 绑定到 SecurityUtils 中
SecurityUtils.setSecurityManager(securityManager);
得到当前执行的用户
Subject currentUser = SecurityUtils.getSubject();
创建 token 令牌,用户名/密码
UsernamePasswordToken token = new UsernamePasswordToken("acey", "123456");
currentUser.login(token);
System.out.println("登录成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("登录失败");
四 shiro 的主要功能 - 授权
权限授权就是访问控制,在应用中控制谁能访问哪些资源
1 权限认证中的几个元素
权限:即操作某个资源的权限,这些资源可以是某个链接,也可以是某个图片,也可以是对某个模块的数据的 CURL
角色:即权限的集合,一个角色可以有多个权限
用户:代表访问的用户,即  Subject
2 授权的流程
当用户访问应用中的某个资源时,会被 SecurityManager 拦截.
SecurityManager 会去调用 Authorizer(授权器)
Authorizer 会根据 Subject 的身份去相应的 Realm 中去查找该 Subject 是否有权限去访问该资源
3 授权实现
1) 导包2) 配置 permission(权限) resources/shiro_permission.ini
authc.loginUrl=/login
//表示用户登录失败跳转到 /login
roles.unauthorrizedUrl=/unauthorrized.jsp //表示用户没有对应的访问角色跳转到/unauthorrized.jsp
perms.unauthorrizedUrl=/unauthorrized.jsp
//表示用户没有对应的访问权限跳转到/unauthorrized.jsp
acey=123456,role1,role2
jack=123,role1
role1=user:select // role1 角色有访问 user:select 的权限
role2=user:add,/delete //role2 角色有访问 user:add 和 /delete 的权限
/login=anon
//表示任何用户都可以访问 /login
/index=authc //表示只有身份认证通过的用户才可以访问 /index
/index=roles[role1,role2...] //表示只有用户含有 role1 role2 ... 角色才可以访问 /index
/index=perms["user:create","/update"]
//表示只有用户含有 "user:create"
和"/update"权限才可以访问 /index
/index?=authc //`?`通配符,表示一个字符,如/index1 /indexa /index- (不能匹配/index) ,
将符合这种规则的请求进行`authc`拦截
/index*=authc
`*`通配符,表示零个或一个或多个字符,如/index1213asd /index /index2 ,
将符合这种规则的请求进行`authc`拦截
/index/**=authc
`**`表示匹配零个或一个或多个路径,如/index/create /index/create/update/...
将符合这种规则的请求进行`authc`拦截
/index*/**authc
可以匹配 /index12/create/update/...
3)配置 roles (角色) resources/shiro_role.ini
acey=123456,role1,role2 //表示有一个用户,用户名是acey,密码为123456,有role1和role2角色
jack=123,role1
4) 验证用户角色是否足够
public class RoleTest {
使用 checkRole 来检验角色时,若权限不足会返回 false
public void testHasRole() {
Subject currentUser= ShiroUtil.login("classpath:shiro_role.ini", "acey", "123456");
// Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
System.out.println(currentUser.hasRole("role1")?"has role1":"has not role1");
currentUser.logout();
使用 checkRole 来检验角色时,若权限不足会抛出异常
public void testCheckRole() {
Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "acey", "123456");
// Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
currentUser.checkRole("role1");
currentUser.logout();
5) 验证用户权限是否足够
public class PermissionTest {
使用 checkPermission 来检验权限时,若权限不足会返回 false
public void testIsPermitted() {
Subject currentUser= ShiroUtil.login("classpath:shiro_permission.ini", "acey", "123456");
System.out.println(currentUser.isPermitted("user:select")?"has user:select":"hsa not user:select");
currentUser.logout();
使用 checkPermission 来检验权限时,若权限不足会抛出异常
public void testCheckPermitted() {
Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "acey", "123456");
// Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
currentUser.checkPermission("user:select");
currentUser.logout();
五 ssm 和 shiro 整合
1) 导入依赖2)配置 web.xml(shiro过滤器)
&!-- shiro过滤器定义 --&
&filter-name&shiroFilter&/filter-name&
&filter-class&org.springframework.web.filter.DelegatingFilterProxy&/filter-class&
&init-param&
&!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 --&
&param-name&targetFilterLifecycle&/param-name&
&param-value&true&/param-value&
&/init-param&
&filter-mapping&
&filter-name&shiroFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
3)编写自己的 Realm(一般权限都是从数据库中查找,所以需要自定义)
public class MyRealm extends AuthorizingRealm{
private UserService userS
* 为当前登录的用户授予角色和权限
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//获取用户名
String userName=(String)principals.getPrimaryPrincipal();
SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
//进行授权角色
authorizationInfo.setRoles(userService.getRoles(userName));
//进行授权权限
authorizationInfo.setStringPermissions(userService.getPermissions(userName));
return authorizationI
*验证当前登录的用户
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String userName=(String)token.getPrincipal();
//根据用户名查找用户信息
User user=userService.getByUserName(userName);
if(user!=null){
AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(user.getUserName(),user.getPassword(),getName());
return authcI
4) spring 和 shiro 配置整合
&!-- 自定义Realm --&
&bean id="myRealm" class="com.acey.realm.MyRealm"/&
&!-- 安全管理器 --&
&bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"&
&property name="realm" ref="myRealm"/&
&!-- Shiro过滤器 --&
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&!-- Shiro的核心安全接口,这个属性是必须的 --&
&property name="securityManager" ref="securityManager"/&
&!-- 身份认证失败,则跳转到登录页面的配置 --&
&property name="loginUrl" value="/index.jsp"/&
&!-- 权限认证失败,则跳转到指定页面 --&
&property name="unauthorizedUrl" value="/unauthor.jsp"/&
&!-- Shiro连接约束配置,即过滤链的定义 --&
&property name="filterChainDefinitions"&
/login=anon
/admin*=authc
/student=roles[teacher]
/teacher=perms["user:create"]
&/property&
&!-- 保证实现了Shiro内部lifecycle函数的bean执行 --&
&bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/&
&!-- 开启Shiro注解 --&
&bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/&
&bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"&
&property name="securityManager" ref="securityManager"/&
一般角色和权限都存在数据库中,所以我们还可以自定义一个 filter 去自己验证每一个请求的 Subject 是否有权限去访问,这样我们就可以减少对过滤链的维护.比如
&!-- Shiro过滤器 --&
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&!-- Shiro的核心安全接口,这个属性是必须的 --&
&property name="securityManager" ref="securityManager"/&
&!-- 身份认证失败,则跳转到登录页面的配置 --&
&property name="loginUrl" value="/index.jsp"/&
&!-- 权限认证失败,则跳转到指定页面 --&
&property name="unauthorizedUrl" value="/unauthor.jsp"/&
&!-- Shiro连接约束配置,即过滤链的定义 --&
&property name="filterChainDefinitions"&
/login=anon
/admin*=authc
/student=roles[teacher]
/teacher=perms["user:create"]
&/property&
&!-- Shiro过滤器 --&
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&!-- Shiro的核心安全接口,这个属性是必须的 --&
&property name="securityManager" ref="securityManager"/&
&!-- 身份认证失败,则跳转到登录页面的配置 --&
&property name="loginUrl" value="/index.jsp"/&
&!-- 权限认证失败,则跳转到指定页面 --&
&property name="unauthorizedUrl" value="/unauthor.jsp"/&
&property name="ownFilter" class="ownFilter.class"&
&!-- Shiro连接约束配置,即过滤链的定义 --&
&property name="filterChainDefinitions"&
/login=anon
/**=ownFilter
&/property&
欢迎大家拍砖
终身学习实践者

我要回帖

更多关于 ssm整合shiro 下载 的文章

 

随机推荐