# shiro_test **Repository Path**: xiaoyuwifi/shiro_test ## Basic Information - **Project Name**: shiro_test - **Description**: shiro安全框架学习 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-21 - **Last Updated**: 2021-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # shiro_test #### 介绍 shiro安全框架学习 #### 软件架构 软件架构说明 #### 知识笔记 1. 授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法 2. AuthorizingRealm 类继承自 AuthenticatingRealm, 但没有实现 AuthenticatingRealm 中的 doGetAuthenticationInfo, 所以认证和授权只需要继承 AuthorizingRealm 就可以了. 同时实现他的两个抽象方法. 1. 为什么使用 MD5 盐值加密: 2. 如何做到: 1). 在 doGetAuthenticationInfo 方法返回值创建 SimpleAuthenticationInfo 对象的时候, 需要使用 SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName) 构造器 2). 使用 ByteSource.Util.bytes() 来计算盐值. 3). 盐值需要唯一: 一般使用随机字符串或 user id 4). 使用 new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); 来计算盐值加密后的密码的值. 1. 如何把一个字符串加密为 MD5 2. 替换当前 Realm 的 credentialsMatcher 属性. 直接使用 HashedCredentialsMatcher 对象, 并设置加密算法即可. # 密码的比对: 通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对! 1. 获取当前的 Subject. 调用 SecurityUtils.getSubject(); 2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAuthenticated() 3. 若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象 1). 创建一个表单页面 2). 把请求提交到 SpringMVC 的 Handler 3). 获取用户名和密码. 4. 执行登录: 调用 Subject 的 login(AuthenticationToken) 方法. 5. 自定义 Realm 的方法, 从数据库中获取对应的记录, 返回给 Shiro. 1). 实际上需要继承 org.apache.shiro.realm.AuthenticatingRealm 类 2). 实现 doGetAuthenticationInfo(AuthenticationToken) 方法. 6. 由 shiro 完成对密码的比对.