登陆认证时,必须要先构造登陆令牌。
在是shiro中,用AuthenticationToken接口来表达登陆令牌。
这里介绍shiro的AuthenticationToken体系,在实际使用中,很多时候需要继承原有令牌实现私有化功能。
一、shiro身份验证的基本概念:
(1)身份验证:
这就不多说了,给shiro传递【身份+证明】,就可以进行验证。
(2)身份
粗浅的说,相当于账户。比如手机号、邮箱、用户名这些。
准确的说,相当于身份。
shiro中把这个封装成了【principals】
(3)证明
证明其实就是密码。
shiro中把这个封装成了【credentials】
二、接口
public interface AuthenticationToken extends Serializable {
/**
* 返回身份信息,相当于用户的用户名
*/
Object getPrincipal();
/**
* 返回用户凭证信息,相当于用户的用户密码
*/
Object getCredentials();
三、shiro token体系
RememberMeAuthenticationToken:添加了记住我的功能
HostAuthenticationToken:添加了获取用户主机的功能
UsernamePasswordToken:shiro认证中最常用的一种,里面封装了用户的用户名,密码,用户主机,是否记住我的功能
BearerToken:里面封装了一个字符串token,该字符串token为用户的一些不敏感信息经过加密之后生成的,可以通过一定的规则解密来获取用户的信息,主要在web应用中结合自定义Realm使用,用于前后端分离,将字符串token放到header中传给系统进行验证。

四、实际使用
(1)常规登录,登录后分配session,并设置session过期时间。
@LogAnnotation
@ApiOperation(value = "web端登陆")
@PostMapping("/sys/login")
public void login(String username, String password) {
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
SecurityUtils.getSubject().login(usernamePasswordToken);
// 设置shiro的session过期时间
SecurityUtils.getSubject().getSession().setTimeout(serverProperties.getServlet().getSession().getTimeout().toMillis());
}
(2)前后端分离登录,不用session,用token来控制这种无状态。
@LogAnnotation
@ApiOperation(value = "Restful方式登陆,前后端分离时登录接口")
@PostMapping("/sys/login/restful")
public Token restfulLogin(String username, String password) {
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
SecurityUtils.getSubject().login(usernamePasswordToken);
return tokenManager.saveToken(usernamePasswordToken);
}
本文介绍了Shiro身份验证的基本概念,包括身份和证明的定义。详细讲解了AuthenticationToken接口及其在实际使用中的扩展,如RememberMeAuthenticationToken、HostAuthenticationToken、UsernamePasswordToken和BearerToken的用途。同时,讨论了在Spring Boot中如何在常规登录和前后端分离场景下利用这些令牌进行身份验证。
1849

被折叠的 条评论
为什么被折叠?



