美文网首页
shiro使用redis缓存时,出现NotSerializabl

shiro使用redis缓存时,出现NotSerializabl

作者: 优优我心喵 | 来源:发表于2021-04-26 04:01 被阅读0次
 /*
    CustomRealm.java
    认证
   */
  @Override
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    String principal = (String) token.getPrincipal();
    UserService userService = (UserService) ApplicationUtils.getBeanByName("userService");
    User user = userService.findUser(principal);
    System.out.println(user.toString());
    /*
      旧代码会抛出NotSerializableException:org异常,替换成下面代码就可以了
      [OLD] ByteSource salt = ByteSource.Util.bytes(user.getSalt());
      [NEW] MySimpleByteSource salt = new MySimpleByteSource(user.getSalt());
    */

    if (!ObjectUtils.isEmpty(user)){
      MySimpleByteSource salt = new MySimpleByteSource(user.getSalt());
      return new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(), salt ,this.getName());
    }
    return null;
  }
package com.example.demo.utils;

import org.apache.shiro.codec.Base64;
import org.apache.shiro.codec.CodecSupport;
import org.apache.shiro.codec.Hex;
import org.apache.shiro.util.ByteSource;

import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Arrays;

/**
 * @ClassName MySimpleByteSource
 * @Description 解决Shiro使用redis缓存时,出现NotSerializableException
 * @Author uuorb
 * @Date 2021/4/26 3:52 上午
 * @Version 0.1
 **/

public class MySimpleByteSource implements ByteSource, Serializable {
  private static final long serialVersionUID = 5175082362119580768L;

  private  byte[] bytes;
  private String cachedHex;
  private String cachedBase64;

  public MySimpleByteSource(){
  }

  public MySimpleByteSource(byte[] bytes) {
    this.bytes = bytes;
  }

  public MySimpleByteSource(char[] chars) {
    this.bytes = CodecSupport.toBytes(chars);
  }

  public MySimpleByteSource(String string) {
    this.bytes = CodecSupport.toBytes(string);
  }

  public MySimpleByteSource(ByteSource source) {
    this.bytes = source.getBytes();
  }

  public MySimpleByteSource(File file) {
    this.bytes = (new MySimpleByteSource.BytesHelper()).getBytes(file);
  }

  public MySimpleByteSource(InputStream stream) {
    this.bytes = (new MySimpleByteSource.BytesHelper()).getBytes(stream);
  }

  public static boolean isCompatible(Object o) {
    return o instanceof byte[] || o instanceof char[] || o instanceof String || o instanceof ByteSource || o instanceof File || o instanceof InputStream;
  }

  public void setBytes(byte[] bytes) {
    this.bytes = bytes;
  }

  @Override
  public byte[] getBytes() {
    return this.bytes;
  }


  @Override
  public String toHex() {
    if(this.cachedHex == null) {
      this.cachedHex = Hex.encodeToString(this.getBytes());
    }
    return this.cachedHex;
  }

  @Override
  public String toBase64() {
    if(this.cachedBase64 == null) {
      this.cachedBase64 = Base64.encodeToString(this.getBytes());
    }

    return this.cachedBase64;
  }

  @Override
  public boolean isEmpty() {
    return this.bytes == null || this.bytes.length == 0;
  }
  @Override
  public String toString() {
    return this.toBase64();
  }

  @Override
  public int hashCode() {
    return this.bytes != null && this.bytes.length != 0? Arrays.hashCode(this.bytes):0;
  }

  @Override
  public boolean equals(Object o) {
    if(o == this) {
      return true;
    } else if(o instanceof ByteSource) {
      ByteSource bs = (ByteSource)o;
      return Arrays.equals(this.getBytes(), bs.getBytes());
    } else {
      return false;
    }
  }

  private static final class BytesHelper extends CodecSupport {
    private BytesHelper() {
    }

    public byte[] getBytes(File file) {
      return this.toBytes(file);
    }

    public byte[] getBytes(InputStream stream) {
      return this.toBytes(stream);
    }
  }

}

相关文章