Shiso
1、Shiro的简介
1、1Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。
本教程只介绍基本的Shiro使用,不会过多分析源码等,重在使用。
2shiro的作用:
2.1Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等
3、运行机制
Authentication:身份认证/登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
Web Support:Web支持,可以非常容易的集成到Web环境;
Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing:提供测试支持;
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
二、主要核心内容:
Name |
Description |
Realm |
数据安全中心,即保存用户名密码的地方,可以是文件,可以是数据库,LDAP 等,Reaml 就是一个特定的安全 DAO,它为 Shiro 提供所需的数据 |
Subject |
描述当前用户,User 这个词通常隐含的指一个人,但是 Subject 可以是一个人也可以代表第三方服务,守护账户,定时作业,或者其他类似的与软件交互的事物。 |
SecurityManager |
所有 Subject 实例都与一个 SecurityManager 绑定,当你和一个 Subject 交互时,所有交互都会通过 SecurityManager 转换为特定 Subject 的交互。SecurityManager 及其内贸部对象图一旦被应用配置,它基本上就被放在一边不再被程序员使用了, 开发人员基本上总是在与 Subject 的相关 API 打交道。它在幕后支持 Subject 的安全操作。 |
Principal |
简单的理解为用户名 |
Cridential |
简单的理解为密码 |
Shiro 的 [urls]规则
Name |
Description |
/index.html = anon |
目录下的 index.html 可以匿名访问 |
/user/** = authc |
user 目录下的所有资源都需要经过认证后才可访问 |
/admin/** = authc, roles[administrator] |
admin 目录下的所有资源必须经过认证,并且需要管理员角色才能访问 |
Shiro的优点和缺点
(一) FreeMarker的优点
1、简单易懂,开源框架。
2.可以实现, 认证、授权、加密、会话管理、与Web集成、缓存
00001. 简单性,Shiro 在使用上较 Spring Security 更简单,更容易理解。
00002. 灵活性,Shiro 可运行在 Web、EJB、IoC、Google App Engine 等任何应用环境,却不依赖这些环境。而 Spring Security 只能与 Spring 一起集成使用。
Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。如下是它所具有的特点:
· 易于理解的 Java Security API;
· 简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);
· 对角色的简单的签权(访问控制),支持细粒度的签权;
· 支持一级缓存,以提升应用程序的性能;
· 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
· 异构客户端会话访问;
· 非常简单的加密 API;
· 不跟任何的框架或者容器捆绑,可以独立运行。
3.
三、缓存利用Cache防止同一帐号重复登录
需求概要
对于B/S应用系统中客户经常会提出同一帐号不能重复登录的需求,就是说,用某一帐号登录系统后,在系统不超时的情况下,任何人都不能再用目前已登录的帐号登录系统。包括我目前的项目中同样有这一需求。
其实要实现这个功能也不难,方法也有多种,比如用数据库来记录用户登录情况、用Application来保存用户登录信息、用Cache来保存信息等等。现在我们就来讨论一下如何利用缓存Cache方便地实现此功能。
解决方法
我们都知道Cache与Session这二个状态对像的其中有一个不同之处,Cache是一个全局对象,作用的范围是整个应用程序,所有用户;而Session是一个用户会话对象,是局部对象,用于保存单个用户的信息。
我们只要把每次用户登录后的用户信息存储在Cache中,把Cache的Key名设为用户的登录名,Cache的过期时间设置为Session的超时时间,在用户每次登录的时候去判断一下Cache[用户名]是否有值,如果没有值,证明该用户没有登录,否则该用户已登录。
3、