Java 编程语言最初是由太阳计算机系统公司开发的,该公司由 James gosling 于 1995 年创立,它的主要组成部分就是 Java 平台。 截止到 2008 年 12 月,最新发布的 Java 标准版本是第六版(J2SE)。随着 Java 的发展进步和它的广泛流行, Java 做出了很多调整从而适应不同类型的平台。例如: J2EE 是为企业级应用程序设计的, J2ME 是为移动应用程序设计的。
Java 是一种高级的编程语言,它最初是由 Sun 公司开发并于 1995 年公开发布的。Java 可以在不同的平台上运行,例如:Windows,Mac OS 和不同版本的 Unix。本指南将让你对 Java 有一个彻底的认识与了解。 本指南将带你用简单并且实用的方法来学习 Java 编程语言。 适用人群本指南是为那些初学者准备的,可以帮助他们理解编程语言从低级到高级的概念。
有时候需要显示当前在线人数、当前在线用户,有时候可能需要强制某个用户下线等;此时就需要获取相应的在线用户并进行一些操作。本章基于《第十六章 综合实例》代码构建。会话控制器@RequiresPermissions("session:*")@Controller@RequestMapping("/sessions")public class SessionController { @Autowired private SessionDAO sessionDAO;
在做一些企业内部项目时或一些互联网后台时;可能会涉及到集中权限管理,统一进行多项目的权限管理;另外也需要统一的会话管理,即实现单点身份认证和授权控制。学习本章之前,请务必先学习《第十章 会话管理》和《第十六章 综合实例》,本章代码都是基于这两章的代码基础上完成的。
在做用户登录功能时,很多时候都需要验证码支持,验证码的目的是为了防止机器人模拟真实用户登录而恶意访问,如暴力破解用户密码 / 恶意评论等。目前也有一些验证码比较简单,通过一些 OCR 工具就可以解析出来;另外还有一些验证码比较复杂(一般通过如扭曲、加线条 / 噪点等干扰)防止 OCR 工具识别;
在一些场景中,比如某个领导因为一些原因不能进行登录网站进行一些操作,他想把他网站上的工作委托给他的秘书,但是他不想把帐号 / 密码告诉他秘书,只是想把工作委托给他;此时和我们可以使用 Shiro 的 RunAs 功能,即允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。本章代码基于《第十六章 综合实例》,请先了解相关数据模型及基本流程后再学习本章。
在一些环境中,可能需要把 Web 应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时带上相应的用户名进行登录。如一些 REST 风格的 API,如果不使用 OAuth2 协议,就可以使用如 REST+HMAC 认证进行访问。HMAC(Hash-based Message Authentication Code):基于散列的消息认证码,使用一个密钥和一个消息作为输入,生成它们的消息摘要。
用过 Spring Security 的朋友应该比较熟悉对 URL 进行全局的权限控制,即访问 URL 时进行权限匹配;如果没有权限直接跳到相应的错误页面。Shiro 也支持类似的机制,不过需要稍微改造下来满足实际需求。不过在 Shiro 中,更多的是通过 AOP 进行分散的权限控制,即方法级别的;而通过 URL 进行权限控制是一种集中的权限控制。本章将介绍如何在 Shiro 中完成动态 URL 权限控制。
在某些项目中可能会遇到如每个账户同时只能有一个人登录或几个人同时登录,如果同时有多人登录:要么不让后者登录;要么踢出前者登录(强制退出)。比如 spring security 就直接提供了相应的功能;Shiro 的话没有提供默认实现,不过可以很容易的在 Shiro 中加入这个功能。
目前很多开放平台如新浪微博开放平台都在使用提供开放 API 接口供开发者使用,随之带来了第三方应用要到开放平台进行授权的问题,OAuth 就是干这个的,OAuth2 是 OAuth 协议的下一个版本,相比 OAuth1,OAuth2 整个授权流程更简单安全了,但不兼容 OAuth1,具体可以到 OAuth2 官网 http://oauth.net/2/ 查看,OAuth2 协议规范可以参考 http://tools.ietf.org/html/rfc6749。
简单数据字典用户 (sys_user)名称类型长度描述idbigint 编号 主键usernamevarchar100用户名passwordvarchar100密码saltvarchar50盐role_idsvarchar100角色列表lockedbool 账户是否锁定组织机构 (sys_organization) 名称类型长度描述idbigint 编号 主键…
Shiro 1.2 开始提供了 Jasig CAS 单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。此处我们使用 Jasig CAS v4.0.0-RC3 版本:https://github.com/Jasig/cas/tree/v4.0.
对于 SSL 的支持,Shiro 只是判断当前 url 是否需要 SSL 登录,如果需要自动重定向到 https 进行访问。 首先生成数字证书,生成证书到 D:\localhost.keystore使用 JDK 的 keytool 命令,生成证书(包含证书 / 公钥 / 私钥)到 D:\localhost.keystore:keytool -genkey -keystore "D:\localhost.
Shiro 提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下:首先在登录页面选中 RememberMe 然后登录成功;如果是浏览器登录,一般会把 RememberMe 的 Cookie 写到客户端并保存下来;关闭浏览器再重新打开;会发现浏览器还是记住你的;
Shiro 的组件都是 JavaBean/POJO 式的组件,所以非常容易使用 Spring 进行组件管理,可以非常方便的从 ini 配置迁移到 Spring 进行管理,且支持 JavaSE 应用及 Web 应用的集成。 在示例之前,需要导入 shiro-spring 及 spring-context 依赖,具体请参考 pom.xml。spring-beans.xml 配置文件提供了基础组件如 DataSource、DAO、Service 组件的配置。
Shiro 提供了类似于 Spring 的 Cache 抽象,即 Shiro 本身不实现 Cache,但是对 Cache 进行了又抽象,方便更换不同的底层 Cache 实现。对于 Cache 的一些概念可以参考我的《Spring Cache 抽象详解》:http://jinnianshilongnian.iteye.com/blog/2001040。 Shiro 提供的 Cache 接口:public interface Cache<K, V>
Shiro 提供了完整的企业级会话管理功能,不依赖于底层容器(如 web 容器 tomcat),不管 JavaSE 还是 JavaEE 环境都可以使用,提供了会话管理、会话事件监听、会话存储 / 持久化、容器无关的集群、失效 / 过期支持、对 Web 的透明支持、SSO 单点登录的支持等特性。即直接使用 Shiro 的会话管理可以直接替换如 Web 容器的会话管理。
Shiro 提供了 JSTL 标签用于在 JSP/GSP 页面进行权限控制,如根据登录用户显示相应的页面按钮。导入标签库<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>标签库定义在 shiro-web.jar 包下的 META-INF/shiro.tld 中定义。guest 标签<shiro:guest>欢迎游客访问,<a href="${pageContext.request.contextPath}/login.jsp">登录<
拦截器介绍Shiro 使用了与 Servlet 一样的 Filter 接口进行扩展;所以如果对 Filter 不熟悉可以参考《Servlet 3.1 规范》http://www.iteye.com/blogs/subjects/Servlet-3-1了解 Filter 的工作原理。首先下图是 Shiro 拦截器的基础类图: 1、NameableFilterNameableFilter 给 Filter 起个名字,如果没有设置默认就是 FilterName;还记得之前的如 authc 吗?
Shiro 提供了与 Web 集成的支持,其通过一个 ShiroFilter 入口来拦截需要安全控制的 URL,然后进行相应的控制,ShiroFilter 类似于如 Strut2/SpringMVC 这种 web 框架的前端控制器,其是安全控制的入口点,其负责读取配置(如 ini 配置文件),然后判断 URL 是否需要登录 / 权限等工作。
关注时代Java