浅谈shiro

本篇文章主要是对权限框架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_第1张图片
shiro 的执行图

为什么要使用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_第2张图片
shiro的相关jar包

添加shiro的XML 配置


浅谈shiro_第3张图片
浅谈shiro_第4张图片
shiro的xml配置

若果是web项目,还需要在web.xml文件中配置shiro的filter。


浅谈shiro_第5张图片
shiroFilter

自己可以重写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来处理权限;

你可能感兴趣的:(浅谈shiro)