springboot-shiro:用户认证
1 在MyController中增加登录控制器
src/main/java/com/lv/controller/MyController.java
@RequestMapping("/login")
public String login(String username,String password,Model model){
//获取当前的用户
Subject subject = SecurityUtils.getSubject();
//封装用户的登录数据
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try{
subject.login(token);//执行登录方法,如果没有异常就说明ok了
return "index";
}catch (UnknownAccountException e){//用户名不存在
model.addAttribute("msg","用户名错误");
return "login";
}catch (IncorrectCredentialsException e){//密码不存在
model.addAttribute("msg","密码错误");
return "login";
}
}
2 修改登陆页面
在 login.html 中增加一个提示信息并给 form 表单添加一个提交地址
src/main/resources/templates/login.html
<body>
<h1>登录</h1>
<hr>
<p th:text="${msg}" style="color:red;"></p>
<form th:action="@{/login}">
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
<p><input type="submit"></p>
</form>
</body>
3 在 UserRealm 中编写用户认证的判断逻辑
src/main/java/com/lv/config/UserRealm.java
package com.lv.config;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
//自定义的UserRealm extends AuthorizingRealm
public class UserRealm extends AuthorizingRealm {
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了=>授权doGetAuthorizationInfo");
return null;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行了=>认证doGetAuthorizationInfo");
//假设数据库的用户名和密码
String name = "root";
String password = "123456";
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
if (!userToken.getUsername().equals(name)){//判断用户名是否正确
return null;//shiro底层就会抛出 UnknownAccountException
}
//验证密码,我们可以使用一个AuthenticationInfo实现类 SimpleAuthenticationInfo
//shiro会自动帮我们验证!重点是第二个参数就是要验证的密码!
return new SimpleAuthenticationInfo("",password,"");
}
}
4 启动程序测试
访问登录页面输入错误的用户名和密码
登录失败并提示用户名错误,接下来输入正确的用户名,和错误的密码
登录失败提示密码错误,接下来输入正确的用户名和正确的密码
登录成功,实现了登录认证