浅谈shiro

作者: 胡GaQue | 来源:发表于2018-04-19 13:52 被阅读153次

    本篇文章主要是对权限框架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?

         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的相关jar包

    添加shiro的XML 配置

    shiro的xml配置

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

    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

        本文链接:https://www.haomeiwen.com/subject/jtxwkftx.html