SpringBoot和shiro整合项目实战三(图解超详细)

承接上一篇博客:https://blog.csdn.net/qq_41115379/article/details/113032617
下一篇博客:https://blog.csdn.net/qq_41115379/article/details/113106449
首先要说的是,这个项目实战是参考自黑马,可以去对应视频看一看:https://www.bilibili.com/video/BV1ct411x7CN
SpringBoot和shiro整合项目实战三(图解超详细)_第1张图片

接下来就是实现用户登录功能
首先是修改login.html


<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>登录页面title>
head>
<body>
<h3>登录h3>
<h3 th:text="${msg}" style="color:red"> h3>
<form method="post" action="/loginlogin">
    用户名:<input type="text" name="name"/><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
form>
body>
html>

然后修改对应的controller

package com.example.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    //测试方法
    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("UserController.hello()");
        return "ok";
    }
    //在使用 @RequestMapping后,返回值通常解析为跳转路径,
    // 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body
    //测试thymeleaf
    //所以注意的是 这边是没加@ResponseBody,也就是他就是一个跳转路径,所以要创建一个test
    @RequestMapping("/testThymeleaf")
    public String testThymeleaf(Model model){
        //把数据存入到model中
        model.addAttribute("name","wzw");
        //返回界面
        return "test";
    }
    //用户的增加
    @RequestMapping("/add")
    public String add(){
        System.out.println("UserController.add()");
        //这里返回的是路径
        //所以是需要删除ResponseBody
        return "user/add";
    }
    //用户的更新
    @RequestMapping("/update")
    public String update(){
        System.out.println("UserController.update()");
        //同理返回路径
        return "user/update";
    }
    //用户的的登录
    @RequestMapping("/login")
    public String login(){
        System.out.println("UserController.login()");
        //同理返回路径
        return "login";
    }
    /**
     * 登录逻辑处理
     */
    //这里的话 我把页面就改成了loginlogin
    @RequestMapping("/loginlogin")
    //model这个参数是用来存一些可用的信息
    public String loginlogin(String name,String password,Model model){
        /**
         * 这里就开始使用shiro编写认证了
         */
        //1.获取subject,调用Sercurity的方法
        Subject subject = SecurityUtils.getSubject();
        //然后封装用户数据
        UsernamePasswordToken token=new UsernamePasswordToken(name,password);
        //然后调用subject的登录方法,并使用try catch来分别捕获用户名和密码这两个异常
        try {
            subject.login(token);
            //登录成功就直接去test界面好了
            return "redirect:/testThymeleaf";
            //然后修改两个不同的异常
        } catch (UnknownAccountException e) {
            //这个是用户名不存在的异常
            model.addAttribute("msg","用户名不存在");
            //然后就需要返回到登录页面
            return "/login";
        }catch (IncorrectCredentialsException e) {
            //这个是密码错误的异常
            model.addAttribute("msg","密码错误");
            //然后就需要返回到登录页面
            return "/login";
        }

    }


}

运行一下application看一下
SpringBoot和shiro整合项目实战三(图解超详细)_第2张图片
SpringBoot和shiro整合项目实战三(图解超详细)_第3张图片
SpringBoot和shiro整合项目实战三(图解超详细)_第4张图片
会发现命令行这边已经进入了认证逻辑
在这里插入图片描述
所以在UserRelam这边修改这个认证逻辑

package com.example.shiro;

import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 自定义的Realm shiro有两个功能,认证和授权,所以刚好实现这两个功能
 */
public class UserRealm extends AuthorizingRealm {

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行授权逻辑");
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("执行认证逻辑");
        //假设数据库的用户名和密码
        String name="wzw";
        String password="123";
        //编写shiro判断逻辑,也就是判断用户名和密码
        //首先是判断用户名, 也就是看和数据库的是否一致,强制转换这个,然后就可以对比了
        UsernamePasswordToken token= (UsernamePasswordToken)authenticationToken;
        if(!token.getUsername().equals(name)){
            //也就是用户名不存在,直接返回null就行,shiro的底层会抛出异常的
            return null;//shiro底层 UnKnowAccountException
        }
        //判断密码的话,可以认为是shiro可以自动判断,只需要返回AuthenticationInfo的一个子类,并且返回对应的参数即可
        //第一个和最后一个参数可以省略,只需要中间这个参数是密码即可
        return new SimpleAuthenticationInfo("",password,"");
    }
}

SpringBoot和shiro整合项目实战三(图解超详细)_第5张图片
这样子如果输入正确的,就会返回正确的了。

你可能感兴趣的:(学习)