shiro 账号密码和手机短信登入,重写realm

本文介绍了如何使用Shiro框架实现自定义登录方式,包括基于用户名密码的UsernamePasswordToken和手机短信的PhoneToken。通过自定义Token并在控制器中选择合适的Token类型, Realm将根据Token类型进行不同的身份验证。然而,Shiro的ModularRealmAuthenticator在处理多Realm时会捕获异常,为了解决这个问题,我们需要重写doMultiRealmAuthentication方法,确保认证异常能被自定义异常处理器捕获并处理。
摘要由CSDN通过智能技术生成

用户名密码使用的token自然是UsernamePasswordToken,我们可以参考UsernamePasswordToken,自定义PhoneToken,在不同的控制器中传入Token,然后由Realm判断当前的Token属于UsernamePasswordToken还是PhoneToken。

自定义Token:

public class PhoneToken implements HostAuthenticationToken, RememberMeAuthenticationToken, Serializable {
   
    // 手机号码
    private String phone;
    private boolean rememberMe;
    private String host;
    /**
     * 重写getPrincipal方法
     */
    public Object getPrincipal() {
   
        return phone;
    }
    /**
     * 重写getCredentials方法
     */
    public Object getCredentials() {
   
        return phone;
    }
    public PhoneToken() {
    this.rememberMe = false; }
    public PhoneToken(String phone) {
    this(phone, false, null); }
    public PhoneToken(String phone, boolean rememberMe) {
    this(phone, rememberMe, null); }
    public PhoneToken(String phone, boolean rememberMe, String host) {
   
        this.phone = phone;
        this.rememberMe = rememberMe;
        this.host = host;
    }
    public String getPhone() {
   
        return phone;
    }
    public void setPhone(String phone) {
   
        this.phone = phone;
    }
    @Override
    public String getHost() {
   
        return host;
    }
    @Override
    public boolean isRememberMe() {
   
        return rememberMe;
    }
}
定义PhoneRealm

```java
public class PhoneRealm extends AuthorizingRealm {
    @Resource
    UserService userService;
    // 认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        PhoneToken token = null;
        // 如果是PhoneToken,则强转,获取phone;否则不处理。
        if(authenticationToken instanceof PhoneToken){
            token = (PhoneToken) authenticationToken;
        }else{
            return null;
        }
        String phone = (String) token.getPrincipal();
        UserDO user = userService.selectByPhone(phone);
        if (user == null) {
            throw new CustomAuthenticationException("手机号错误");
        }
        return new SimpleAuthenticationInfo(user, phone, this.getName());
    }
    // 授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }
    @Override
    public boolean s
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值