springboot-shiro:用户认证

承接: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 启动程序测试

访问登录页面输入错误的用户名和密码

登录失败并提示用户名错误,接下来输入正确的用户名,和错误的密码

登录失败提示密码错误,接下来输入正确的用户名和正确的密码

登录成功,实现了登录认证

posted @ 2022-03-09 09:23  从0开始丿  阅读(70)  评论(0编辑  收藏  举报