zoukankan      html  css  js  c++  java
  • Shiro权限管理框架

    一、Shiro介绍

      Apache Shiro 是Java 的一个安全框架。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与Web 集成、缓存等。

      既然shiro将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。

           shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。

           java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro。

    二、Shiro基本概念

      Shiro 不会去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro即可

    1,Authentication

      身份认证/登录,验证用户是不是拥有相应的身份。

    2,Authorization

      授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限。

    3,Session Manager

      会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的。

    4,Cryptography

      加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储。

    5,Web Support

      Web 支持,可以非常容易的集成到Web 环境。

    6,Caching

      缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率。

    7,Concurrency

      shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去。

    8,Testing

      提供测试支持。

    9,Run As

      允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;

    10,Remember Me

      记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。

    三、Shiro架构

    1,Subject

      Subject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。   

       Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权。

    2,SecurityManager

      SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。

            SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。

    3,Authenticator

      Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。

    4,Authorizer

      Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

    5,realm

      Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

            注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

     6,sessionManager

      sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

    7,SessionDAO

      SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

    8,CacheManager

      CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

    9,Cryptography

      Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

    四、Shiro过滤器 

      Shiro 内置了很多默认的过滤器,比如身份验证、授权等相关的。默认过滤器可以参考org.apache.shiro.web.filter.mgt.DefaultFilter中的过滤器:

      anon           org.apache.shiro.web.filter.authc.AnonymousFilter
      authc          org.apache.shiro.web.filter.authc.FormAuthenticationFilter
      authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
      perms         org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
      port             org.apache.shiro.web.filter.authz.PortFilter
      rest             org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
      roles           org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
      ssl               org.apache.shiro.web.filter.authz.SslFilter
      user            org.apache.shiro.web.filter.authc.UserFilter
      logout         org.apache.shiro.web.filter.authc.LogoutFilter

    anon:例子

      /admins/**=anon 没有参数,表示可以匿名使用。

    authc:例子

      /admins/user/**=authc表示需要认证(登录)才能使用,FormAuthenticationFilter是表单认证,没有参数

    使用FormAuthenticationFilter过虑器实现 ,原理如下:

      将用户没有认证时,请求loginurl进行认证,用户身份和用户密码提交数据到loginurl。

      FormAuthenticationFilter拦截住取出request中的username和password(两个参数名称是可以配置的)。

      FormAuthenticationFilter调用realm传入一个token(username和password)。

      realm认证时根据username查询用户信息(在Activeuser中存储,包括 userid、usercode、username、menus)。

      如果查询不到,realm返回null,FormAuthenticationFilter向request域中填充一个参数(记录了异常信息)。

  • 相关阅读:
    线段树专辑—— pku 1436 Horizontally Visible Segments
    线段树专辑——pku 3667 Hotel
    线段树专辑——hdu 1540 Tunnel Warfare
    线段树专辑—— hdu 1828 Picture
    线段树专辑—— hdu 1542 Atlantis
    线段树专辑 —— pku 2482 Stars in Your Window
    线段树专辑 —— pku 3225 Help with Intervals
    线段树专辑—— hdu 1255 覆盖的面积
    线段树专辑—— hdu 3016 Man Down
    Ajax跨域访问
  • 原文地址:https://www.cnblogs.com/guanghe/p/10688083.html
Copyright © 2011-2022 走看看