旅游网站做模板素材/营销软文范例大全100
- Shiro架构体系
- Shiro是Apache的一个开源的安全框架,是一个的权限管理,实现用户认证,用户授权、会话管理、web集成。缓存模块的轻量级安全框架。
- Shiro的分为四个体系构成
- applicationCode(应用程序代码)
- Subject():主题结构
- ShiroSecurityManager(Shrio安全管理器):主要的API
- Reaim(域的意思):是在整个 Shiro框架的安全数据源
- 运行流程原理
- 首先将需要将需要进行安全验证的应用程序代码交给Shiro的Subject主体进行管理认证授权,Subject将授权的认证委托给ShiroSecurityManager管理器,管理器从Reaim中取出相关的授权数据完成整个认证和授权的操作

认证的流程:
用户认证,用户去访问系统,系统要验证用户身份的合法性。
最常用的用户身份验证的方法:
1、用户名密码方式。
2、指纹打卡机。
3、基于证书验证方法。
系统验证用户身份合法,用户方可访问系统的资源。

授权的流程:
授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。
权限的赋予分为角色赋予和权限赋予

Shiro架构

- Subject
subject:主体,与应用交互的用户,主体要访问系统,系统需要对主体进行认证、授权。subject主题包含任何和程序交互的抽象概念都为主体
- SecurityManager(安全)
securityManager:安全管理器,主体进行认证和授权都 是通过securityManager进行。
- Authenticator(认证)
Authenticator即认证器,主体进行认证最终通过authenticator进行的。
- Authorizer(授权)['ɔːθəraɪz]
Authorizer即授权器,主体进行授权最终通过authorizer进行的。
- sessionManager(会话管理)
sessionManager即会话管理,如果写过Servlet就应该知道Session的概念,Session呢需要有人去管理它的生命周期,这个组件就是SessionManager;shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。
- SessionDAO(操作session的一套接口)
SessionDAO即会话dao,DAO大家都用过,数据访问对象,用于会话的CRUD,比如我们想把Session保存到数据库,那么可以实现自己的SessionDAO,通过如JDBC写到数据库;比如想把Session放到Memcached中,可以实现自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache进行缓存,以提高性能;
- CacheManager(缓存)
缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能
- realm(数据源)
Realm即领域,相当于datasource数据源,可以是JDBC实现,也可以是LDAP实现,或者内存实现等等,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。
注意:Shiro不知道你的用户/权限存储在哪及以何种格式存储;所以我们一般在应用中都需要实现自己的Realm;
- Cryptography(加密) [krɪp'tɑːɡrəfi]
Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。
- Shiro jar包

- Shiro.ini文件编写的要求
- Shiro配置文件
- 一般放在classpath下由Shiro自动读取
- 存储的格式为Kay/Value键值对的配置
- INI配置文件适用于少量用户且不需要在运行时动态创建的情境下使用
- INT,文件配置Shiro分为四个模块部分
- 1.main:主体
- main主体配置Shrio的对象如:SecurityManager、Realm、authenticator、authcStrategy(授权策略)
- 2.Users:用户模块
- 允许配置一组静态的用户,包含用户名、密码、角色、,一个用户可以有多个角色,角色之前使用逗号分割
- 3.roles: 角色模块
- 将角色和的权限关联起来,格式为:角色名=权限字符串1,权限字符串2...
- role角色
- printer资源
- create操作
- user:create:表示可以对用户这个的资源进行创建的操作等同于user:create:*
- 表示可以用户资源下的所有实例进行创建操作
- user:create:01:表示对用户资源下的01实例有创建的操作
- user:*:01:表示对用户资源下的01实例有全部的操作
- 语法格式:资源:操作:实例
role=printer:create,printer:query
- 实现简单的认证(jdbcRealm:jdbcRealm来源认证)
- Shiro.ini文件
[main]
#数据源的配置
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#配置数据源
dataSource = com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass = com.mysql.jdbc.Driver
dataSource.jdbcUrl = jdbc:mysql:///test
dataSource.user = root
dataSource.password = 159302#将创建好的数据源注入jdbc.Realm
jdbcRealm.dataSource = $dataSource#将jdbcRealm注入给SecurityManager
securityManager.realm = $jdbcRealm
- 测试类
@Testpublic void test1() {//1.构建访问路径 文件读取@SuppressWarnings("deprecation")IniSecurityManagerFactory securityManagerFactory = new IniSecurityManagerFactory("classpath:shiro_hellor.ini");//2.构建securityManager的实例对象SecurityManager sm = securityManagerFactory.getInstance();//3.设置SecurityManager到运行环境中SecurityUtils.setSecurityManager(sm);//4.获取主体对象SubjectSubject subject = SecurityUtils.getSubject();//5.创建用户的令牌UsernamePasswordToken token = new UsernamePasswordToken("root", "123456");//6.使用subject进行身份的校验subject.login(token);//判断是否被认证通过true为通过不通过抛出异常System.out.println(subject.isAuthenticated());
}
- 实现认证和授权
- 继承AuthenticatingRealm类(该类不带授权的功能,老版本存在bug任何的认证都能通过)建议使用AuthorizingRealm实现自定义认证
- 重写内部的方法
- 参数接收一个AuthenticationToken令牌
- 方法返回一个认证信息一般使用子类AuthenticationInfo进行参数的返回使用实现类
- SimpleAuthenticationInfo进行认证的返回
- 使用构造方法接收三个的参数
- 1.用户名
- 2.凭证
- 3.自定义的Realm名称
- 认证:
public class CustomRealm extends AuthenticatingRealm{@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {//自定义的realm的认证数据需要从数据查询在这里为了方便将数据连接的省略//将数据写死SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo("root","123456", "custRealm");return simpleAuthenticationInfo;}}
- 授权
/*** 授权方法*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //角色授权是在数据库查询而出的简化操作写死//角色授权返回数据库查询到的角色进行返回info.addRole("管理员");//权限赋值info.addStringPermission("菜单");return info;}
- 核心文件的配置
[main]
#设置自定义的认证器
custRealm = com.sxt.customrealm.CustomRealm
#设置凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher#设置加密的属性
credentialsMatcher.hashIterations=2
credentialsMatcher.hashAlgorithmName = MD5
#配置realm的凭证属性
custRealm.credentialsMatcher=$credentialsMatcher#配置自定义realm
securityManager.realm = $custRealm
- 认证和授权的执行流程
- 创建IniSecurityManagerFactroy工厂读取核心文件(高版本已经过时)
- 通过工厂对象获取SecurityManager对象
- 使用SecurityUtils的setSecurityManager()防方法将SecurityManager对象添加到运行环境中
- 通过SecurityUtils获取Subject对象
- 创建UsernamePasswordToken令牌将用户认证进行封装
- 使用Subject的login()方法提交认证,该方法会调用自定义凭证匹配器内的doGetAuthenticationInfo()方法进行凭证的验证并且将凭证的信息返回
- 调用subject.hashRole(Stirng role)(基于角色的权限赋予):查看又没有指定的角色会调用自定义凭证匹配器的doGetAuthorizationInfo()方法进行信息的返回
- isPermitted(String permitted ) :基于权限的权限赋予查看有无指定的权限