在线会话管理有时候需要显示当前在线人数、当前在线用户,有时候可能需要强制某个用户下线等;此时就需要获取相应的在线用户并进行一些操作。会话控制器@RequiresPermissions("session:*")@Controller@RequestMapping("/sessions")publicclassSessionController{@AutowiredprivateSessionDAOsessionDAO;@RequestMapping()publicStringlist(Modelmodel){Collection<Session>
多项目集中权限管理及分布式会话在做一些企业内部项目时或一些互联网后台时;可能会涉及到集中权限管理,统一进行多项目的权限管理;另外也需要统一的会话管理,即实现单点身份认证和授权控制。学习本章之前,请务必先学习《第十章会话管理》和《第十六章综合实例》,本章代码都是基于这两章的代码基础上完成的。本章示例是同域名的场景下完成的,如果跨域请参考《第十五章单点登录》和《第十七章OAuth2集成》了解使用CAS或OAuth2实现跨域的身份验证和授权。另外比如客户端/服务器端的安全校验可参考《第二十章无状态Web应用集成》。部署架构有三个应用:用于用户/权限控制的Server(端口:8080);两个应用App
集成验证码在做用户登录功能时,很多时候都需要验证码支持,验证码的目的是为了防止机器人模拟真实用户登录而恶意访问,如暴力破解用户密码/恶意评论等。目前也有一些验证码比较简单,通过一些OCR工具就可以解析出来;另外还有一些验证码比较复杂(一般通过如扭曲、加线条/噪点等干扰)防止OCR工具识别;但是在中国就是人多,机器干不了的可以交给人来完成,所以在中国就有很多打码平台,人工识别验证码;因此即使比较复杂的如填字、算数等类型的验证码还是能识别的。所以验证码也不是绝对可靠的,目前比较可靠还是手机验证码,但是对于用户来说相对于验证码还是比较麻烦的。对于验证码图片的生成,可以自己通过如Java提供的图像AP
授予身份及切换身份在一些场景中,比如某个领导因为一些原因不能进行登录网站进行一些操作,他想把他网站上的工作委托给他的秘书,但是他不想把帐号/密码告诉他秘书,只是想把工作委托给他;此时和我们可以使用Shiro的RunAs功能,即允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。本章代码基于《第十六章综合实例》,请先了解相关数据模型及基本流程后再学习本章。表及数据SQL请运行shiro-example-chapter21/sql/shiro-schema.sql表结构请运行shiro-example-chapter21/sql/shiro-schema.sql数据实体具体请参考com.g
无状态Web应用集成在一些环境中,可能需要把Web应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时带上相应的用户名进行登录。如一些REST风格的API,如果不使用OAuth2协议,就可以使用如REST+HMAC认证进行访问。HMAC(Hash-basedMessageAuthenticationCode):基于散列的消息认证码,使用一个密钥和一个消息作为输入,生成它们的消息摘要。注意该密钥只有客户端和服务端知道,其他第三方是不知道的。访问时使用该消息摘要进行传播,服务端然后对该消息摘要进行验证。如果只传递用户名+密码的消息摘要,一旦被别人捕获可能会重复使
动态URL权限控制用过SpringSecurity的朋友应该比较熟悉对URL进行全局的权限控制,即访问URL时进行权限匹配;如果没有权限直接跳到相应的错误页面。Shiro也支持类似的机制,不过需要稍微改造下来满足实际需求。不过在Shiro中,更多的是通过AOP进行分散的权限控制,即方法级别的;而通过URL进行权限控制是一种集中的权限控制。本章将介绍如何在Shiro中完成动态URL权限控制。本章代码基于《第十六章综合实例》,请先了解相关数据模型及基本流程后再学习本章。表及数据SQL请运行shiro-example-chapter19/sql/shiro-schema.sql表结构请运行shiro
并发登录人数控制在某些项目中可能会遇到如每个账户同时只能有一个人登录或几个人同时登录,如果同时有多人登录:要么不让后者登录;要么踢出前者登录(强制退出)。比如springsecurity就直接提供了相应的功能;Shiro的话没有提供默认实现,不过可以很容易的在Shiro中加入这个功能。示例代码基于《第十六章综合实例》完成,通过ShiroFilter机制扩展KickoutSessionControlFilter完成。首先来看看如何配置使用(spring-config-shiro.xml)kickoutSessionControlFilter用于控制并发登录人数的<beanid="
OAuth2集成目前很多开放平台如新浪微博开放平台都在使用提供开放API接口供开发者使用,随之带来了第三方应用要到开放平台进行授权的问题,OAuth就是干这个的,OAuth2是OAuth协议的下一个版本,相比OAuth1,OAuth2整个授权流程更简单安全了,但不兼容OAuth1,具体可以到OAuth2官网http://oauth.net/2/查看,OAuth2协议规范可以参考http://tools.ietf.org/html/rfc6749。目前有好多参考实现供选择,可以到其官网查看下载。本文使用[ApacheOltu](),其之前的名字叫ApacheAmber,是Java版的参考实现。使
综合实例简单数据字典用户(sys_user)名称类型长度描述名称类型长度描述idbigint 编号主键usernamevarchar100用户名passwordvarchar100密码saltvarchar50盐role_idsvarchar100角色列表lockedbool 账户是否锁定组织机构(sys_organization)名称类型长度描述名称类型长度描述idbigint 编号主键namevarchar100组织机构名priorityint 显示顺序parent_idbigint 父编号parent_idsvarchar100父编号列表availablebool 是否可用资源(sys_
单点登录Shiro1.2开始提供了JasigCAS单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。此处我们使用JasigCASv4.0.0-RC3版本:https://github.com/Jasig/cas/tree/v4.0.0-RC3JasigCAS单点登录系统分为服务器端和客户端,服务器端提供单点登录,多个客户端(子系统)将跳转到该服务器进行登录验证,大体流程如下:访问客户端需要登录的页面http://localhost:9080/client/,此时会跳到单点登录服务器https://local
SSL对于SSL的支持,Shiro只是判断当前url是否需要SSL登录,如果需要自动重定向到https进行访问。首先生成数字证书,生成证书到D:\localhost.keystore使用JDK的keytool命令,生成证书(包含证书/公钥/私钥)到D:\localhost.keystore:keytool-genkey-keystore"D:\localhost.keystore"-aliaslocalhost-keyalgRSA输入密钥库口令:再次输入新口令:您的名字与姓氏是什么?[Unknown]:localhost您的组织单位名称是什么?[Unknown]:sishu
RememberMeShiro提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下:首先在登录页面选中RememberMe然后登录成功;如果是浏览器登录,一般会把RememberMe的Cookie写到客户端并保存下来;关闭浏览器再重新打开;会发现浏览器还是记住你的;访问一般的网页服务器端还是知道你是谁,且能正常访问;但是比如我们访问淘宝时,如果要查看我的订单或进行支付时,此时还是需要再进行身份认证的,以确保当前用户还是你。RememberMe配置spring-shiro-web.xml配置:
与Spring集成Shiro的组件都是JavaBean/POJO式的组件,所以非常容易使用Spring进行组件管理,可以非常方便的从ini配置迁移到Spring进行管理,且支持JavaSE应用及Web应用的集成。在示例之前,需要导入shiro-spring及spring-context依赖,具体请参考pom.xml。spring-beans.xml配置文件提供了基础组件如DataSource、DAO、Service组件的配置。JavaSE应用spring-shiro.xml提供了普通JavaSE独立应用的Spring配置:<!--缓存管理器使用Ehcache实现--><bea
缓存机制Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现。对于Cache的一些概念可以参考我的《SpringCache抽象详解》:http://jinnianshilongnian.iteye.com/blog/2001040。Shiro提供的Cache接口:publicinterfaceCache<K,V>{//根据Key获取缓存中的值publicVget(Kkey)throwsCacheException;//往缓存中放入key-value,返回缓存中之前的值publicVput
会话管理Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性。即直接使用Shiro的会话管理可以直接替换如Web容器的会话管理。会话所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。Shiro的会话支持不仅可以在普通的JavaSE应用中使
JSP标签Shiro提供了JSTL标签用于在JSP/GSP页面进行权限控制,如根据登录用户显示相应的页面按钮。导入标签库<%@taglibprefix="shiro"uri="http://shiro.apache.org/tags"%>标签库定义在shiro-web.jar包下的META-INF/shiro.tld中定义。guest标签<shiro:guest>欢迎游客访问,<ahref="${pageContext.request.contextPath}/login.jsp">登录</a
拦截器机制拦截器介绍Shiro使用了与Servlet一样的Filter接口进行扩展;所以如果对Filter不熟悉可以参考《Servlet3.1规范》http://www.iteye.com/blogs/subjects/Servlet-3-1了解Filter的工作原理。首先下图是Shiro拦截器的基础类图:1、NameableFilterNameableFilter给Filter起个名字,如果没有设置默认就是FilterName;还记得之前的如authc吗?当我们组装拦截器链时会根据这个名字找到相应的拦截器实例;2、OncePerRequestFilterOncePerRequestFilte
与Web集成Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制,ShiroFilter类似于如Struts2/SpringMVC这种web框架的前端控制器,其是安全控制的入口点,其负责读取配置(如ini配置文件),然后判断URL是否需要登录/权限等工作。准备环境1、创建webapp应用此处我们使用了jetty-maven-plugin和tomcat7-maven-plugin插件;这样可以直接使用“mvnjetty:run”或“mvntomcat7:run”直接运行webapp了。然后通过URLhttp://localhost
Realm及相关对象Realm【Realm】及【Authorizer】部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现。1、定义实体及关系即用户-角色之间是多对多关系,角色-权限之间是多对多关系;且用户和权限之间通过角色建立关系;在系统中验证时通过权限验证,角色只是权限集合,即所谓的显示角色;其实权限应该对应到资源(如菜单、URL、页面按钮、Java方法等)中,即应该将权限字符串存储到资源实体中,但是目前为了简单化,直接提取一个权限表,【综合示例】部分会使用完整的表结构。用户实体包括:编号(id)、用户名(username)、密码(password)、盐(s
编码/加密在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的600wcsdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。编码/解码Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作。Shiro内部的一些数据的存储/表示都使用了base64和16进制字符串。base64编码/解码操作:Stringstr="hello";Stringbase64Encoded=Base64.encodeToString(str.getBytes());Stringstr2=Base64.decode
INI配置之前章节我们已经接触过一些INI配置规则了,如果大家使用过如Spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即可以理解为是一个IoC/DI容器,但是区别在于它从一个根对象securityManager开始。根对象SecurityManager从之前的Shiro架构图可以看出,Shiro是从根对象SecurityManager进行身份验证和授权的;也就是所有操作都是自它开始的,这个对象是线程安全且整个应用只需要一个即可,因此Shiro提供了SecurityUtils让我们绑定它为全局的,方便后续操作。因为Shiro的类都是POJO的,因此都很容易放到任
Shiro授权授权授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。主体主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。资源在应用中用户可以访问的URL,比如访问JSP页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问。权限安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问
身份验证身份验证,即在应用中谁能证明他就是他本人。一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份:principals:身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。一个主体可以有多个principals,但只有一个Primaryprincipals,一般是用户名/密码/手机号。credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。最常见的principals和credential
简介ApacheShiro是Java的一个安全框架。目前,使用ApacheShiro的人越来越多,因为它相当简单,对比SpringSecurity,可能没有SpringSecurity做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。本教程只介绍基本的Shiro使用,不会过多分析源码等,重在使用。Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。这不就是我