本篇文章主要是对权限框架shiro的一个小总结。写的不对的地方或者哪里需要修改的欢迎大家给出意见。
shiro是什么
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
主要功能
三个核心组件:Subject, SecurityManager 和 Realms.
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
为什么要使用shiro?
shiro 的安全,围绕着 2点来, 1 是 角色 2是权限
我们通常是角色对应一组权限,他这边不是的。
我们系统中角色不是固定的,但是权限是固定的,比如 角色允许动态去创建,因此我们只可以拿权限来判断
比如 useraction 里面的add 方法 我可以通过 一个注解 参数为 user:add 代表 shiro 维护的当前请求用户的 这个人只要有 user:add 就可以了。
比如 useraction 里面有一个 findbean (获取一个bean的信息) 又有一个listdata(获取列表数据) 他们都是查看权限 他们的注解加入同一个 user:see 就可以了
如果用传统的url拦截我们需要给 findbean 和 listdata 各配置一个url权限(他们是不同的url),很显然用shiro 去做这件事更方便一些。
另外,比较好的就是shiro 自带了前台的标签
我们在列表页面 的添加按钮,动态判断是否有 user:add 这个权限,如果有才给他显示, 不用shiro 我们需要自己写一个标签,现在shiro 自带标签。
shiro的简单demo
工具说明: 这里楼主使用的开发工具是IntelliJ IDEA,jdk用的1.8
代码说明:
首先加入shiro的依赖包。楼主使用的maven来进行管理
添加shiro的XML 配置
若果是web项目,还需要在web.xml文件中配置shiro的filter。
自己可以重写relam类,定义自己的权限规范,这里也相当于是shiro使用的一个重点。继承 org.apache.shiro.realm.AuthorizingRealm;这个类。并且重写其中的doGetAuthorizationInfo以及doGetAuthenticationInfo方法。第一个方法是对用户授权,第二个方法是对用户进行认证。
shiro的验证原理分析:shiro 登录验证的时候会封装一个subject。然后我们可以通过这个subject 的用户名或者其他标致来查询是否拥有这个用户,如果没有的话会抛出一个 org.apache.shiro.authc.UnknownAccountException 。然后通过这个用户名或者其他标志从数据库查出来的实体类做比较。如果符合则返回一个AuthenticationInfo。没有验证成功则抛出一系列异常。
异常总结:
<-- 身份认证异常 -->
<--身份令牌异常,不支持的身份令牌-->
org.apache.shiro.authc.pam.UnsupportedTokenException
<-- 未知账户/没找到帐号,登录失败-->
org.apache.shiro.authc.UnknownAccountException
<--帐号锁定-->
org.apache.shiro.authc.LockedAccountException
<--用户禁用-->
org.apache.shiro.authc.DisabledAccountException
<--登录重试次数,超限。只允许在一段时间内允许有一定数量的认证尝试-->
org.apache.shiro.authc.ExcessiveAttemptsException
<--一个用户多次登录异常:不允许多次登录,只能登录一次 。即不允许多处登录--->
org.apache.shiro.authc.ConcurrentAccessException
<-- 账户异常-->
org.apache.shiro.authc.AccountException
<--过期的凭据异常-->
org.apache.shiro.authc.ExpiredCredentialsException
<--- 错误的凭据异常 -->
org.apache.shiro.authc.IncorrectCredentialsException
<--凭据异常-->
org.apache.shiro.authc.CredentialsException
org.apache.shiro.authc.AuthenticationException
<--权限异常-->
<--没有访问权限,访问异常 -->
org.apache.shiro.authz.HostUnauthorizedException
org.apache.shiro.authz.UnauthorizedException
<-- 授权异常 -->
org.apache.shiro.authz.UnauthenticatedException
org.apache.shiro.authz.AuthorizationException
<-- shiro全局异常 -->
org.apache.shiro.ShiroException
shiro的授权分析:shiro的授权主要是利用角色和权限信息来控制用户的权限,通过每一个角色的不同来确定对应的权限。可以配置多个数据源relam来处理权限;