文章目录
- 1.自定义Realm
- 2.Realm的原理分析
- 3.加密功能
1.自定义Realm
Shiro 默认的登录认证是不带加密的,如果想要实现加密认证需要自定义登录认证,自定义 Realm。
MyRealm.java
/**
* 自定义的Realm
*
*/
public class MyRealm extends AuthorizingRealm{
/**
* 认证方法
* @param token
* 就是我们在测试代码中 定义的UsernamePasswordToken对象
* 有我们保存的需要验证的账号密码信息
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 获取账号信息
String principal = (String) token.getPrincipal();
// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456
// 验证账号
if(!"root".equals(principal)){
// 账号错误
return null;
}
String pwd = "123456";
// 验证密码
AuthenticationInfo info = new SimpleAuthenticationInfo(principal, pwd,"myrealm");
return info;
}
/**
* 授权方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
}
}
shiro.ini
[main]
#自定义 realm
customRealm=com.atguigu.shiro.realm.MyRealm
#将realm设置到securityManager
securityManager.realms=$customRealm
测试
@Test
public void test() {
// 1.获取SecurityManager工厂对象
Factory<SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro.ini");
// 2.通过Factory对象获取SecurityManager对象
SecurityManager securityManager = factory.getInstance();
// 3.将SecurityManager对象添加到当前运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 4.获取Subject对象
Subject subject = SecurityUtils.getSubject();
AuthenticationToken token = new UsernamePasswordToken("root", "12345");
// 登录操作
try {
subject.login(token);
} catch (UnknownAccountException e) {
System.out.println("账号出错...");
} catch(IncorrectCredentialsException e){
System.out.println("密码出错...");
}
// 获取登录的状态
System.out.println(subject.isAuthenticated());
}
2.Realm的原理分析
为何必须要继承 AuthenticatingRealm
类
1.认证的核心代码
2.在AuthorzingRealm提供了doGetAuthenticationInfo(token) 的抽象方法
3.自定义Realm被调用的时机为认证的时候开始的, 调用我们自己写的Realm的方法
4.密码认证的时机还是在AuthorzingRealm中实现的
检验密码的代码
SimpleCredentialsMatcher.doCredentialsMatch()
3.加密功能
实际系统开发中,一些敏感信息需要进行加密,比如说用户的密码。Shiro 内嵌很多常用的加密算法,比如 MD5 加密。Shiro 可以很简单的使用信息加密。
public class ShiroMD5 {
public static void main(String[] args) {
// 加密
String password = "z3";
Md5Hash md5Hash = new Md5Hash(password);
System.out.println(md5Hash);
// 带盐的md5
Md5Hash md5Hash1 = new Md5Hash(password, "salt");
System.out.println(md5Hash1.toHex());
// 多次迭代
Md5Hash md5Hash2 = new Md5Hash(password, "salt", 3);
System.out.println(md5Hash2.toHex());
// 父类实现
SimpleHash simpleHash = new SimpleHash("MD5", password, "salt", 3);
System.out.println(simpleHash.toHex());
}
}
- Md5Hash
- 带盐的md5功能
- 多次迭代的带盐的md5功能
- 父类实现的功能