Apache Shiro自学之基础概念
一、写在前面
Java下的安全框架,当属Apache基金会的Apache Shiro和Spring家族的Spring Security最为出名了,今天先介绍相对简单一点的Shiro(反正网上都是这么说的),了解一下Shiro的相关基本概念,以后再介绍Spring Security。
二、功能介绍
2.1 Shiro包含如下图所示的10个功能:
-
Authentication:身份认证/登录,用于验证用户是不是拥有相应的身份;
-
Authorization:授权,即权限验证,验证某个已通过认证的用户是否拥有某个权限,判断用户是否能做某件事,常见如:验证某个用户是否具有某个角色,或者细粒度的验证某个用户对某个资源是否拥有某个权限;
-
Session Management:会话管理,用户登陆后就是一次会话,在没有退出之前,他的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是Web环境的;
-
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库而不是明文存储;
-
Web Support:Web支持,便于进行web环境集成;
-
Caching:缓存,比如:用户登录后,其用户信息、拥有的角色/权限不必每次去查询,可以提高效率;
-
Concurrency:Shiro支持多线程应用的并发验证,即再一个线程中开启另一个线程,能把权限自动传播过去;
-
Testing:测试支持;
-
Run As:允许一个用户假装为另一个用户(如果允许的话)的身份进行访问;
-
Remember Me:记住我,非常常见的功能,即一次登陆以后,下次再访问时就不用登录了。
2.2 运行原理
Shiro运行原理图1(应用程序角度)如下:
- Subject:主体,代表当前用户,这个用户不一定是一个具体的人,与当前应用程序交互的任何东西都是Subject,所有的Subject都绑定到Security Manager,与Subject的所有交互都委托给SecurityManager。
- Security Manager:安全管理器,所有与安全有关的操作都会与SecurityManager交互,且它管理着所有的Subject,它负责与后面介绍的其他组件进行交互,如果学习过Spring MVC,可以将其视为DispatcherServlet。
- Realm:域,Shiro从Realm中获取安全数据(如用户、角色、权限等),Security Manager要验证用户身份,那么它需要从Realm中获取相应的用户进行比较以确定用户身份是否合法,也需要从Realm中得到用户相应的角色/权限来进行验证用户是否能进行相应操作,我们可以把Realm视为一个DataSource,即一个安全数据源。
Shiro运行原理图2(Shrio内部角度)如下:
-
Subject:主体,可以看到主体可以是任何与应用交互的“用户”;
-
Security Manager:相当于是Spring MVC中的DispatcherServlet或者Struts2中的FilterDispatcher,它是Shiro的核心,所有具体的交互都通过Security Manager进行控制。它管理着所有的Subject,且负责进行认证、授权、会话、缓存的管理。
-
Authenticator:认证器,负责Subject认证,如果用户觉得Shiro默认的不好,可以自定义实现;
-
Authorizer:授权器,也叫访问控制器,它决定Subject是否有权限进行相应的操作,即控制着用户能访问应用中的哪些功能。
-
Realm:可以有一个或者N个Realm,可以视为安全数据元,用于获取安全实体,实现形式多种多样,可以是JDBC实现、LDAP实现、内存实现等等;
-
SessionManager:Session需要有人去管理它的生命周期,SessionManager就是干这个事情的;
-
SessionDAO:Session的数据访问对象,用于会话的CRUD,可以自定义SessionDAO的实现,控制session存储位置,如通过JDBC写入数据库或者jedis写入redis,也可以使用Cache进行缓存,以提高性能;
-
CacheManager:缓存管理器,用来管理如用户、角色、权限等的缓存,放到缓存中可以有效提高访问的性能。
2.3 过滤器
过滤器名称 对应的Java类 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 noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter 解释:
01./admins/**=anon # 表示该 uri 可以匿名访问
02./admins/**=auth # 表示该 uri 需要认证才能访问
03./admins/**=authcBasic # 表示该 uri 需要 httpBasic 认证
04./admins/**=perms[user:add:*] # 表示该 uri 需要认证用户拥有 user:add:* 权限才能访问
05./admins/**=port[8081] # 表示该 uri 需要使用 8081 端口
06./admins/**=rest[user] # 相当于 /admins/**=perms[user:method],其中,method 表示 get、post、delete 等
07./admins/**=roles[admin] # 表示该 uri 需要认证用户拥有 admin 角色才能访问
08./admins/**=ssl # 表示该 uri 需要使用 https 协议
09./admins/**=user # 表示该 uri 需要认证或通过记住我认证才能访问
10./logout=logout # 表示注销,可以当作固定配置
注意:
anon、auth、authcBasic、user这些是认证过滤器
perms、roles、ssl、rest、port这些是授权过滤器
下一篇我们就来自己实现一下Springboot与Shiro的认证集成