一、回顾
回顾上文我们了解到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
如下图测试时可以看出,达到了登录校验的效果!