shiro的基本流程
- 获取当前的subject,调用SecurityUtils.getSubject()
- 测试当前的用户是否已经被认证,即是否已经登录,调用subject的isAuthenticated()
- 若没有被认证,则把用户名和密码封装为UsernamePasswordToken对象
1)创建一个表单页面
2)把数据传递到springMVC的Handler - 执行登录,调用subject的login(AuthenticationToken)方法
- 自定义realm的方法,从数据库中获取的记录,返回给shiro, 需要继承org.apache.shiro.realm.AuthenticatingRealm类,实现doGetAuthenticationInfo(AuthenticationToken)方法
- 由shiro完成对密码的比对
Shiro密码的比对
通过AuthenticatingRealm的credentialsMatcher的属性来进行密码的比对
为什么使用MD5来进行密码加密,如何做到
- 在doGetAuthenticationInfo方法返回值创建 SimpleAuthenticationInfo 对象的时候, 需要使用
SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName) 构造器 - 使用ByteSource.Util.bytes()来计算盐值
- 盐值要唯一,一般使用随机字符串或user的id
- 使用new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations)来计算盐值加密后密码的值
如何把一个字符串加密为 MD5
替换当前 Realm 的 credentialsMatcher 属性. 直接使用 HashedCredentialsMatcher 对象, 并设置加密算法即可.
shiro的授权问题
- 授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法
- AuthorizingRealm 类继承自 AuthenticatingRealm, 但没有实现 AuthenticatingRealm 中的
doGetAuthenticationInfo, 所以认证和授权只需要继承 AuthorizingRealm 就可以了. 同时实现他的两个抽象方法.