金博文档
Shiro几大核心功能.
2.1Authentication:认证.用户的登录,退出属于认证.
2.2Authorization:授权.菜单授权,元素可见性授权等.
2.3Cryptography:加密.密码加密,md5加密等.
2.4 SessionManagement: Session管理
2.5 WebIntegration : Web集成.
2.5.1 Shiro不依赖于容器的,可以运行在JavaSE的环境中.
Shiro架构图.
3.1 最上面部分表示Shiro支持各种类型的语言.
3.2 Subject:主体.每个用户登录后都会对应一个Subject对象,所有用户信息都存储到Subject中.
3.3 SecurityManager:Shiro最大的容器.Shiro所有功能都封装在Security Manager中.
3.3.1 编写代码时,想要使用Shiro第一个步骤获取到Security Manager
3.3.2 在整个程序中保证Security Manager有且只有一个.
3.4Authenticator: 认证器.执行认证过程调用的组件.
3.5 Authorizer:授权器.执行授权时调用的组件.
3.6 SessionManager: Session管理器.
3.7 CacheManager: 缓存管理器.Shiro支持很多第三方缓存工具.例如Ehcache等.
3.8 SessionDao: 操作Session内容的组件.
3.9 Realm:该组件的作用负责获取到数据库中数据并根据用户自定义逻辑进行授权和认证等操作.
3.9.1 Shiro 框架和数据库没有关系.没有对数据库设计有认证强制要求.
3.9.2 如果Shiro想要访问数据库都是通过Realm组件.
3.9.3 如果Shiro数据不是来源于数据库,可以使用.ini文件设置静态数据.
二. INI文件介绍
1. INI应用名称(InitializationFile)
2. INI文件是Window系统配置文件的扩展名.
3. Shiro的全局配置文件就是.ini文件.
4. .ini文件内容的语法和.properties类似都是key=value,value格式.
5. INI文件中包含了四个部分
5.1 [main] 主体部分.
5.1.1 这部分配置类对象,或设置属性等操作.
5.1.2 内置了根对象,securityManager
5.1.3 语法:
[main] securityManager.属性=值 key=value securityManager.对象属性=com.jinbo.pojo.People #后面值是字符串
peo=com.jinbo.pojo.People securityManager.对象属性=$peo #出现$时才表示是引用对象 |
5.2 [users] 定义用户,密码及用户可以具有的角色.
5.2.1 语法:
[users] 用户名=密码,角色1,角色2 #角色部分可以省略. zhangsan=zs zhangsan=zs,role1,role2 |
5.3 [roles] 定于角色具有的权限
[roles] 角色名=权限名,权限名 role1=user:insert,user:update role2=insert,update role3=user:* |
5.4 [urls] 定义哪个控制器被哪个过滤器过滤.
[urls] 控制器名称=过滤器名称 /login=authc /**=anon |
三. Shiro环境搭建及认证实现
1. 认证流程
1.1 获取主体,通过主体Subject对象的login方法进行登录
1.2 把Subject中内容传递给SecurityManager
1.3 SecurityManager内部组件Authenticator进行认证,
1.4 认证数据使用InI Realm,调用Ini文件中数据.
2. Principal: 身份.代表用户名,邮箱,手机等能够唯一确认身份的信息.
3. Credential:凭证,代表密码等.
4. AuthenticationInfo:认证时存储认证信息
4.1 如果认证是返回值为null,认证认证时账户不存在.
5. 搭建步骤:
5.1 在pom.xml中依赖shiro-core
<dependencies> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency> </dependencies> |
5.2 在java/main/resources创建shiro配置文件shiro.ini
[users] zhangsan=zs lisi=ls |
5.3 编写认证测试代码
5.3.1 SecurityUtils主要作用能够保证Subject在线程容器中.随时取出Subject
publicstaticvoid main(String[] args) { //创建工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); //创建容器 SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager); //底层使用ThreadLocal所以只要线程不变,可以在任何位置获取到Subject对象. Subject subject = SecurityUtils.getSubject();
//执行登录 AuthenticationToken token = new UsernamePasswordToken("zhangs123an", "zs"); //login方法没有返回值,通过抛出异常告诉用户是什么问题 //org.apache.shiro.authc.UnknownAccountException 帐号不存在 //org.apache.shiro.authc.IncorrectCredentialsException 密码错误 try { subject.login(token); System.out.println("登录成功"); } catch (UnknownAccountException e) { e.printStackTrace(); System.out.println("账户不正确"); }catch(IncorrectCredentialsException e){ System.out.println("密码不正确"); } } |
四. 加密及凭证匹配器
1. 安全的项目敏感信息存储到数据库中一定不是明文存储.都是对这些敏感信息(例如:密码)进行加密处理.在存储.
2. 在Shiro中支持多种加密技术.以MD5加密举例.
3. 代码示例
publicstaticvoid main(String[] args) { String password="zs"; Md5Hash md5Hash = new Md5Hash(password); System.out.println(md5Hash); //加密算法中著名"盐",在程序开发中盐值都是用户的ID等信息. //把原来的字符串和盐拼接,在对拼接的字符串进行加密. Md5Hash md5Hash2 = new Md5Hash(password, "123"); System.out< |