了解Shiro
一Apache Shiro做用
Apache Shiro是一个功能强大且易于使用的Java安全框架,可执行身份验证,受权,加密和会话管理,令行应用程序。java
Shiro提供了应用程序安全API来执行如下几个方面(我喜欢称这些为应用程序安全的四个基石):web
(1)身份验证 - 验证用户身份,一般称为用户“登陆”。数据库
(2)受权 - 访问控制apache
(3)加密 - 保护或隐藏窥探数据缓存
(4)会话管理 - 即用户登陆后就是一次会话,在没有退出以前,它的全部信息都在会话中;
安全
2、shiro架构
(1) Subject
Subject:主体,用来与用户交互的对象。好比认证用户信息, subject.login(用户信息)。再好比,判断用户是否有相关的角色 subject.hasRole("小学生");
Subject实例都绑定到(而且 须要)SecurityManager。当你与Subject进行交互时,这些交互转化为与SecurityManager的交互。session
(2) SecurityManager
SecurityManager即安全管理器,对所有的subject进行安全管理,它是shiro的核心,负责对全部的subject进行安全管理。经过SecurityManager能够完成subject的认证、受权等,实质上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提供了一套加密/解密的组件,方便开发。好比提供经常使用的散列、加/解密等功能。
代码示例
public class MyFirstTest { @Test public void test1() { //加载配置文件,并获取工厂,这个SecurityManager当心与java.lang包下的SecurityManager冲突 Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro_1.ini"); //获取安全管理者实例 org.apache.shiro.mgt.SecurityManager sm = factory.getInstance(); //将安全管理者放入全局对象 SecurityUtils.setSecurityManager(sm); //全局对象经过安全管理者生成Subject对象 Subject subject = SecurityUtils.getSubject(); //封装用户的数据 UsernamePasswordToken token = new UsernamePasswordToken("jay", "123"); //将用户的数据token 最终传递到Realm中进行对比 subject.login(token); //判断本账号是否已经被认证 Assert.assertEquals(true, subject.isAuthenticated()); } }
shiro_1.ini配置文件内容以下,它就是数据源Realm。之后的章节数据源Realm将是JdbcRealm,数据将会被存放到数据库中
[users] jay=123
3、过滤器
当 Shiro 被运用到 web 项目时,Shiro 会自动建立一些默认的过滤器对客户端请求进行过滤。如下是 Shiro 提供的过滤器:
过滤器简称 |
对应的 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 |
解释:
/admins/**=anon # 表示该 uri 能够匿名访问 /admins/**=auth # 表示该 uri 须要认证才能访问 /admins/**=authcBasic # 表示该 uri 须要 httpBasic 认证 /admins/**=perms[user:add:*] # 表示该 uri 须要认证用户拥有 user:add:* 权限才能访问 /admins/**=port[8081] # 表示该 uri 须要使用 8081 端口 /admins/**=rest[user] # 至关于 /admins/**=perms[user:method],其中,method 表示 get、post、delete 等 /admins/**=roles[admin] # 表示该 uri 须要认证用户拥有 admin 角色才能访问 /admins/**=ssl # 表示该 uri 须要使用 https 协议 /admins/**=user # 表示该 uri 须要认证或经过记住我认证才能访问 /logout=logout # 表示注销,能够看成固定配置
注意:
anon,authcBasic,auchc,user 是认证过滤器。
perms,roles,ssl,rest,port 是受权过滤器。
想太多,作太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多作。少校【4】