Shiro完整教程,附带各种配置
1.1 简介:可以略过
Apache Shiro 是 Java 的⼀个安全(权限)框架。shiro安全框架
Shiro 可以⾮常容易的开发出⾜够好的应⽤,其不仅可以⽤在 JavaSE 环境,也可以⽤在 JavaEE 环境。
Shiro 可以完成:认证、授权、加密、会话管理、与Web 集成、缓存 等。
下载:
对⽐Spring Security,可能没有Spring Security做的功能强⼤,但是在实际⼯作时可能并不需要那么复杂的东西,所以使⽤⼩⽽简单的Shiro就⾜够了。
1.2 架构
Shiro可以⾮常容易的开发出⾜够好的应⽤,其不仅可以⽤在JavaSE环境,也可以⽤在JavaEE环境。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。这不就是我们想要的嘛,⽽且Shiro的API也是⾮常简单;其基本功能点如下图所⽰:
Authentication:⾝份认证/登录,验证⽤户是不是拥有相应的⾝份,例如账号密码登陆;
Authorization:授权,即权限验证,验证某个已认证的⽤户是否拥有某个权限;即判断⽤户是否能做事情,常见的如:验证某个⽤户是否拥有某个⾓⾊。或者细粒度的验证某个⽤户对某个资源是否具有某个权限;
Session Manager:会话管理,即⽤户登录后就是⼀次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,⽽不是明⽂存储;
Web Support:Web⽀持,可以⾮常容易的集成到Web环境;
Caching:缓存,⽐如⽤户登录后,其⽤户信息、拥有的⾓⾊/权限不必每次去查,这样可以提⾼效率;
Concurrency:shiro⽀持多线程应⽤的并发验证,即如在⼀个线程中开启另⼀个线程,能把权限⾃动传播过去;
Testing:提供测试⽀持;
Run As:允许⼀个⽤户假装为另⼀个⽤户(如果他们允许)的⾝份进⾏访问;
Remember Me:记住我,这个是⾮常常见的功能,即⼀次登录后,下次再来的话不⽤登录了。
记住⼀点,Shiro不会去维护⽤户、维护权限;这些需要我们⾃⼰去设计/提供;然后通过相应的接⼝注⼊给Shiro即可。
接下来我们分别从外部和内部来看看Shiro的架构,对于⼀个好的框架,从外部来看应该具有⾮常简单
易于使⽤的API,且API契约明确;从内部来看的话,其应该有⼀个可扩展的架构,即⾮常容易插⼊⽤户⾃定义实现,因为任何框架都不能满⾜所有需求。
⾸先,我们从外部来看Shiro吧,即从应⽤程序⾓度的来观察如何使⽤Shiro完成⼯作。如下图:
可以看到:应⽤代码直接交互的对象是Subject,也就是说Shiro的对外API核⼼就是Subject;其每个API的含义:
Subject:主体,应⽤代码直接交互的对象是 Subject,也就是说 Shiro 的对外 API 核⼼就是 Subject , 代表了当前“⽤户”,这个⽤户不⼀定是⼀个具体的⼈,与当前应⽤交互的任何东西都是Subject,如⽹络爬⾍,机器⼈等;即⼀个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是⼀个门⾯;SecurityManager才是实际的执⾏者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro 的核⼼,它负责与后边介绍的其他组件进⾏交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;
Realm:域,Shiro从从Realm获取安全数据(如⽤户、⾓⾊、权限),就是说SecurityManager要验证⽤户⾝份,那么它需要从Realm获取相应的⽤户进⾏⽐较以确定⽤户⾝份是否合法;也需要从Realm得到⽤户相应的⾓⾊/权限进⾏验证⽤户是否能进⾏操作;可以把Realm 看成DataSource,即安全数据源。
也就是说对于我们⽽⾔,最简单的⼀个Shiro应⽤:
1、应⽤代码通过Subject来进⾏认证和授权,⽽Subject⼜委托给SecurityManager;
2、我们需要给Shiro的SecurityManager注⼊Realm,从⽽让SecurityManager能得到合法的⽤户及其权限进⾏判断。
从以上也可以看出,Shiro不提供维护⽤户/权限,⽽是通过Realm让开发⼈员⾃⼰注⼊。
接下来我们来从Shiro内部来看下Shiro的架构,如下图所⽰:
Subject:主体,可以看到主体可以是任何可以与应⽤交互的“⽤户”;
SecurityManager:相当于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher;是Shiro的⼼脏;所有具体的交互都通过SecurityManager进⾏控制;它管理着所有Subject、且负责进⾏认证和授权、及会话、缓存的管理。
Authenticator:认证器,负责主体认证的,这是⼀个扩展点,如果⽤户觉得Shiro默认的不好,可以⾃定义实现;其需要认证策略(Authentication Strategy),即什么情况下算⽤户认证通过了;
Authrizer:授权器,或者访问控制器,⽤来决定主体是否有权限进⾏相应的操作;即控制着⽤户能访问应⽤中的哪些功能;
Realm:可以有1个或多个Realm,可以认为是安全实体数据源,即⽤于获取安全实体的;可以是JDBC实现,也可以是LDAP实现,或者内存实现等等;由⽤户提供;注意:Shiro不知道你的⽤户/权限存储在哪及以何种格式存储;所以我们⼀般在应⽤中都需要实现⾃⼰的Realm;
SessionManager:如果写过Servlet就应该知道Session的概念,Session呢需要有⼈去管理它的⽣命周期,这个组件就是SessionManager;⽽Shiro并不仅仅可以⽤在Web环境,也可以⽤在如普通的JavaSE环境、EJB等环境;所有呢,Shiro就抽象了⼀个⾃⼰的Session来管理主体与应⽤之间交互的
数据;这样的话,⽐如我们在Web环境⽤,刚开始是⼀台Web服务器;接着⼜上了台EJB服务器;这时想把两台服务器的会话数据放到⼀个地⽅,这个时候就可以实现⾃⼰的分布式会话(如把数据放到Memcached服务器);
SessionDAO:DAO⼤家都⽤过,数据访问对象,⽤于会话的CRUD,⽐如我们想把Session保存到数据库,那么可以实现⾃⼰的SessionDAO,通过如JDBC写到数据库;⽐如想把Session放到Memcached中,可以实现⾃⼰的Memcached SessionDAO;另外SessionDAO中可以使⽤Cache进⾏缓存,以提⾼性能;
CacheManager:缓存控制器,来管理如⽤户、⾓⾊、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提⾼访问的性能
Cryptography:密码模块,Shiro提⾼了⼀些常见的加密组件⽤于如密码加密/解密的。
到此Shiro架构及其组件就认识完了,接下来挨着学习Shiro的组件吧。
2.1 过滤器
当 Shiro 被运⽤到 web 项⽬时,Shiro 会⾃动创建⼀些默认的过滤器对客户端请求进⾏过滤。⽐如⾝份验证、授权等 相关的。默认可以参考 org.apache.shiro.DefaultFilter中的枚举
:
以下是 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
解释:
1. /admins/**=anon # 表⽰该 uri 可以匿名访问
2. /admins/**=auth # 表⽰该 uri 需要认证才能访问
3. /admins/**=authcBasic # 表⽰该 uri 需要 httpBasic 认证
4. /admins/**=perms[user:add:*] # 表⽰该 uri 需要认证⽤户拥有 user:add:* 权限才能访问
5. /admins/**=port[8081] # 表⽰该 uri 需要使⽤ 8081 端⼝
6. /admins/**=rest[user] # 相当于 /admins/**=perms[user:method],其中,method 表⽰ get、post、delete 等
7. /admins/**=roles[admin] # 表⽰该 uri 需要认证⽤户拥有 admin ⾓⾊才能访问
8. /admins/**=ssl # 表⽰该 uri 需要使⽤ https 协议
9. /admins/**=user # 表⽰该 uri 需要认证或通过记住我认证才能访问
10. /logout=logout # 表⽰注销,可以当作固定配置
注意:
anon,authcBasic,auchc,user 是认证过滤器。
perms,roles,ssl,rest,port 是授权过滤器。
前⾯的地址⽀持Ant风格
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论