一.什么权限管理
涉及到多用户登录的系统时都要对用户进行权限管理,权限管理属于系统安全的范畴,权限管理主要是为了实现“对用户访问系统的控制”,根据安全规则去控制用户可以访问的资源。
而权限管理又包括两部分“身份认证”和“授权”,简称认证授权,权限管理的过程就是认证授权的过程。用户在访问系统时先对用户的身份进行认证,在认证通过以后根据该用户的权限,然后确定该用户可以访问的资源。
1.什么是身份认证?
身份认证就是判定当前用户是否是一个合法用户的过程,如果是则身份认证通过,否则身份认证失败,最常用的身份认证方式就是我们使用用户名和密码登录,身份认证去查询当前登录的用户名于密码是否正确,其他的还有指纹登录的身份认证,刷卡形式的身份认证。
2.什么是授权?
授权说的是授权访问,对当前用户授予访问的权限,只有拥有的访问的权限我们才能进入到想要浏览的或者说是该用户可以浏览的资源。
1.3举例子说明
形象的说明身份认证与授权的案例,我么可以举这个例子,比如我们上班,在进入大门时,物业需要对你的身份进行辨别,这就是个身份认证的过程,而进入公司后公司可能还有门禁,不同的楼层不同的办公局域,你只拥有了部分进入的权限,因为你这个角色只被授权了部分区域。
二.什么是Shiro?
Shiro是一个功能强大且易于使用的安全框架,使用它可以轻松实现身份验证法、授权、加密、会话管理等功能。
1.Shiro的核心架构
从上图中我们可以看出Shiro最核心的部分就是Security Manager了,我们叫他安全管理器,安全管理器管理哪些内容呢,就是中间那个大方框中的东西了了,有Authenticatior、Authorizer、Session Manager、Session DAO、Cache Manager、PluggableRealms了,这些认不认的东西都要归我们的Security Manager来管理,所以我们使用Shiro最先需要做的事情就是来获取安全管理器,然后才能操作这里面的身份认证、授权、会话管理、缓存管理、域的管理这些。下面我们来一个个认识下这些归于Security Manager管理的东西。
1.Subject /ˈsʌbdʒɪkt/
Subject主题,外部应用于Subject进行交互,Subject负责记录用户的信息,我们也可以将Subject看成一个携带有用户信息的对象,Subject是Shiro中的一个接口,该接口里面定义了很多身份认证与授授权的方法,外部程序或者用户通过Subject进行认证,而Subject就要通过Serurity Manager来进行认证授 权。
2.Security Manager /sɪˈkjʊərəti/
Security Manager安全管理器,他是Shiro的核心,负责对所有的Subject进行身份认证、授权等的实现,实际上Security Manager是通过Authenticatior来实现身份认证,通过Authorizer来实现授权,通过Session Manager来实现会话管理这些功能。
3.Authenticator /ɔːˌθentɪˈkeɪtə/
Authenticator认证器,在实际使用中,不同的场景我们需要对进行的身份认证场景会有差别,所以Shiro把Authenticator设计成了接口,我们可以根据不同的场景做不同的身份认证,但同时Shiro也提供了一个现成的Authenticator的实现类ModularRealmAuthenticator,该类可以满足我们开发中大部分场景的身份验证。
4.Authorizer /ˈɔːθəraɪzə/
Authorizer授权器,用户在通过了Authenticator认证器认证过以后,还需要Authorizer授权器对用户进行授权,方可访问到对应的资源。
5.Realm /relm/
Realm领域,从上面的图中我们可以看出无论是Authenticator认证器,还是Authorizer授权器都是在Realm领域的上方,因为身份认证与授权是需要依赖Realm领域来完成的,身份认需要从Reaml领域中获取用户信息用以和Subject中的用户信息进行比对,授权时要根据当前用户从Realm领域中查找当前用户的权限范围。所以说我们可以将Realm看成一个数据源,这里是数据的来源。那Realm中的数据是哪里来的呢,Realm的数据可以从配置文件中读取,也可以去数据库中查询,一般都会将信息放在数据库中。
6.Session Manager
Session Manager会话管理,Shiro框架自定义了一套会话管理,它不依赖web容器的session,所以即使在非web环境我们依然可以使用Shiro的Session,而且利用Shiro的Session我们可以很容易的实现单点登录,比如登录以后将用户登录成功的信息放入到Session,然后将该信息放入redis中,用户访问其他服务时,就可以直接从redis中验证该用户是否已经登录,从而实现单点登录功能。
7.Session DAO
会话操作DAO,该模块是负责对session信息的增删改查,我们不可能将信息放入到session中以后就不在问了,在用户退出当前登录时或者长久未登录时我们都需要处理当前用户的session信息,Session DAO就是来操作session信息的,我们可以选择把session信息存入到数据库中,不使用时将其删除。
8.Cache Manager
缓存管理,Shiro拥有自己的缓存管理,用以存储用户的缓存信息,这样就不想要每次对用户进行授权时都去数据库中或者配置文件中查找对应用户的权限信息,利用缓存管理来缓存权限信息可以提高用户的服务的响应速度。
9.Cryptography /krɪpˈtɑːɡrəfi/
加密,这里提供了一系列的加密解密方法,因为我们无论将密码是存入到文件中还是数据库中都不可能进行明文存储,都需要对信息进行加密,此外还有一些用户敏感信息,防止泄露都需要进行加密处理。
到这里就已经将Shiro的所有功能点介绍完毕,Shiro被称为安全、简单易用的权限框架。我们可以看出他的核心的东西并不多,就是Security Manager中的Authenticator与Authorizer两部分,其他的都是为这两者服务的,或者更准确的说都是辅助功能,所以掌握这部分才是重点中的重点。
三.总结
Shiro是一款轻便易用的权限框架,该框架的架构并没有多么复杂,而且易于上手,和Spring Security一样都是主流的安全框架,也是日常开发必不可少的技能,这篇文章里主要是介绍了该框架的架构,以及一些转有名词,后续会持续更新该框架的文章。