0
点赞
收藏
分享

微信扫一扫

Shiro-02-自定义Realm和加密功能


文章目录

  • ​​1.自定义Realm​​
  • ​​2.Realm的原理分析​​
  • ​​3.加密功能​​

1.自定义Realm

Shiro 默认的登录认证是不带加密的,如果想要实现加密认证需要自定义登录认证,自定义 Realm。

Shiro-02-自定义Realm和加密功能_java

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-02-自定义Realm和加密功能_自定义_02

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());
}

Shiro-02-自定义Realm和加密功能_java_03

2.Realm的原理分析

为何必须要继承 ​​AuthenticatingRealm​​类

1.认证的核心代码

Shiro-02-自定义Realm和加密功能_父类_04

Shiro-02-自定义Realm和加密功能_java_05

2.在AuthorzingRealm提供了doGetAuthenticationInfo(token) 的抽象方法

3.自定义Realm被调用的时机为认证的时候开始的, 调用我们自己写的Realm的方法

4.密码认证的时机还是在AuthorzingRealm中实现的

Shiro-02-自定义Realm和加密功能_java_06

检验密码的代码

Shiro-02-自定义Realm和加密功能_父类_07

SimpleCredentialsMatcher.doCredentialsMatch()

Shiro-02-自定义Realm和加密功能_开发语言_08

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());
}
}

  1. Md5Hash
  2. 带盐的md5功能
  3. 多次迭代的带盐的md5功能
  4. 父类实现的功能

Shiro-02-自定义Realm和加密功能_自定义_09


举报

相关推荐

0 条评论