实际项目中,使用shiro后登录的实例:
一、登录前端
(1)序列化提交表单
把form表单的值序列化成一个json对象,如{username:admin,password:admin123}
$("#login-form").serialize()
(2)表单
<form id="form1">
<input name="username" type="text" value="" />
<input name="password" type="text" value="" />
</form>
(3)提交
$.ajax({
type : 'post',
url : '/sys/login',
data : $("#login-form").serialize(),
success : function() {
location.href = '/';
})
二、filter
进入过滤器---authc---根据token从redis中获取shiro的UsernamePasswordToken
进入过滤器---logout---根据token从redis中删除shiro的UsernamePasswordToken
//静态资源等:匿名过滤器
filterChainDefinitionMap.put("/img/**", "anon");
/登出:登出过滤器 - 自定义
filterChainDefinitionMap.put("/logout", "logout");
//一般:认证过滤器 - 自定义
filterChainDefinitionMap.put("/**", "authc");
三、Controller
处理登录请求。
(1)传统登录:登录成功后设置session过期时间
(2)restful登陆:将token保存在redis中。
key:"tokens:UUID" value:"usernamePasswordToken.toJSON"
shiro下,两种登录方式:
(1)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)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);
}
注:使用token并不是就没有session了。只是token对应了session,而且是shiro去管理的。
四、shiro-Realm
controller调用shiro认证之后,会交由shiro。
最终会在MyShiroRealm调用--doGetAuthenticationInfo--进行验证。
主要业务逻辑为:
(1)根据usernamePasswordToken获取用户名,判断用户是否存在
(2)判断用户密码
(3)判断用户状态
(4)将登录用户放入session
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
...
}
本文介绍了一个实际项目中使用Shiro进行登录的详细步骤,包括前端序列化JSON对象,过滤器处理授权和登出,Controller中处理登录请求(包括传统和RESTful方式),以及Shiro Realm的认证逻辑,涉及UsernamePasswordToken、session和token的管理。
280

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



