Shiro 学习【二】认证

一、回顾

回顾上文我们了解到Shiro 的简单介绍和请求拦截
Shiro 的简介不用多说,
Shiro请求拦截:
1.引入依赖开始玩Shiro
2.准备好接口,起码需要一个调用接口和一个拦截跳转接口
3.自定义一个Realm,只做拦截的话,是不需要进行认证授权配置的,所以只需继承 AuthorizingRealm 即可
4.创建 ShiroConfig 进行 Shiro 配置,从下往上以此配置,重点在于在 getShiroFilterFactoryBean 中配置拦截
5.使用 Shiro 实现请求拦截即完成

二、认证

所谓 认证,通俗讲就是 “登录校验”

1.编写登录接口,参数用户名密码,传入接口

@PostMapping("/login")
    public String login(@RequestBody UserMpdemo demo){
        // 1 获取当前线程中的 Subject,可以理解为一个请求中绑定有一个 Subject
        Subject subject = SecurityUtils.getSubject();
        // 2 根据输入的用户名密码 生成 Token
        UsernamePasswordToken token = new UsernamePasswordToken(demo.getUsername(), demo.getPassword());
        try {
            //3 进行登录校验 此时进入Realm进行认证校验 (通过异常类型分辨出问题,无异常则登录成功!)
            subject.login(token);
            return "登录成功!";
        }catch (UnknownAccountException e){
            e.printStackTrace();
            return "用户名不存在";
        }catch (IncorrectCredentialsException e){
            e.printStackTrace();
            return "密码错误";
        }catch (LockedAccountException e){
            e.printStackTrace();
            return "用户被锁定";
        }catch (AuthenticationException e){
            return "du du du!出错了";
        }
    }

2.还记得我们自定义的 Realm 嘛?继承 AuthorizingRealm 后重写了两个方法
但是方法体中什么都没做,接下来,就是给它赋予意义的时刻了
此处,只需要变更 doGetAuthenticationInfo 认证方法,授权方法的变更后续会说,目前的操作和他没关系

import com.liu.entity.UserMpdemo;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * @author LiuXT
 */
public class LiuRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了 -> 授权");
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行 -> 认证");

        // 1 模拟数据 (实际需要根据token从库中查询出来)
        UserMpdemo user = new UserMpdemo("001", "root", "123123", "0,1,2");
        // 2 将token转为  可以提取内容的 userToken
        UsernamePasswordToken userToken = (UsernamePasswordToken) token;
        if (!userToken.getUsername().equals(user.getUsername())) {
            // 返回null 即抛出异常  UnknownAccountException -> 用户不存在
            return null;
        }
        //密码校验 完成后 所有校验即完成
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), "");
        return info;
    }
}

效果图:
代码中,我们的模拟数据为
username:root
password:123123
如下图测试时可以看出,达到了登录校验的效果!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值