Spring Boot学习篇(十二)

文章讲述了如何在SpringBoot应用中使用Shiro框架来处理用户登录状态的显示和注销操作。通过在SysUserController类中注入SysUserMapper,查找并存储用户信息到session,在index.html页面展示登录状态,并在ShiroConfig中配置注销路由。测试显示了登录、注销功能的正确运行。

Spring Boot学习篇(十二)

shiro安全框架使用篇(四)

2 在主页显示用户登录状态、用户信息和完成默认注销(不改shiro原来的配置)操作

2.1 变更SysUserController类
2.1.1 在SysUserController类中注入sysUserMapper
@Autowired
SysUserMapper sysUserMapper;
2.1.2 在SysUserController类中的login()方法下面需要增加的代码
SysUser users = sysUserMapper.findUserByUsername(username);
session.setAttribute("users", users);
2.1.3 变更后的SysUserController类的完整代码如下所示
package com.zlz.controller;

import com.zlz.entity.SysUser;
import com.zlz.mapper.SysUserMapper;
import com.zlz.service.ISysUserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/sysUser")
public class SysUserController {
    //增加的代码①
   @Autowired
   SysUserMapper sysUserMapper;
   @RequestMapping("login")
   public String login(String username, String password, RedirectAttributes ra, HttpSession session){
       //获取当前操作对象
       Subject subject = SecurityUtils.getSubject();
       //把用户名、密码存入token中
       UsernamePasswordToken token=new UsernamePasswordToken(username,password);
       try {
           subject.login(token);
           //增加的代码②
           SysUser users = sysUserMapper.findUserByUsername(username);
           session.setAttribute("users", users);
           return "index";
       } catch (UnknownAccountException e) {
           ra.addFlashAttribute("msg", "用户名错误");
       } catch (LockedAccountException e) {
           ra.addFlashAttribute("msg", "该用户被锁定,请联系管理员解锁");
       } catch (IncorrectCredentialsException e) {
           ra.addFlashAttribute("msg", "密码错误");
       }
       //重定向地址栏改变,但因为走的是视图解析器,那么他的地址栏是跟随视图解析器里面的地址栏变化的
       return "redirect:/";
   }
   @RequestMapping("tologin")
   public String tologin(){
       return "login";
   }
   //设置需要登录,但没有登录的方法
    @RequestMapping("unlogin")
    public String unlogin(RedirectAttributes ra){
       ra.addFlashAttribute("msg","请先登录");
       return "redirect:/sysUser/tologin";
    }

}
2.2 变更index.html页面
2.2.1 增加的代码如下所示
<div th:if="${session.users!=null}">
    已登录 用户名:<span th:text="${session.users.username}"></span>
    <!--这个a标签里面的href的地址是自定义的地址-->
    <a href="/zhuxiao">注销</a>
</div>
<div th:if="${session.users==null}">未登录</div>
2.2.2 变更后的index.html页面的完整代码如下所示
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>这是主页!!!!</h1>
    <div th:if="${session.users!=null}">
        已登录 用户名:<span th:text="${session.users.username}"></span>
        <!--这个a标签里面的href的地址是自定义的地址-->
        <a href="/zhuxiao">注销</a>
    </div>
    <div th:if="${session.users==null}">未登录</div>
    <a href="/product/find">查询商品</a>
    <a href="/product/insert">添加商品</a>
    <a href="/product/update">修改商品</a>
    <a href="/product/delete">删除商品</a>
</body>
</html>
2.3 变更ShiroConfig类
2.3.1 增加的部分
map.put("/zhuxiao", "logout");
2.3.2 变更后完整的ShiroConfig类代码如下所示
package com.zlz.config;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    //安全管理器的配置
    @Bean
    public DefaultWebSecurityManager securityManager(){
        DefaultWebSecurityManager dws=new DefaultWebSecurityManager();
        dws.setRealm(mysqlRealm());
        //设置会话管理器,保证第一次访问的时候不会出错
        dws.setSessionManager(new DefaultWebSessionManager());
        return dws;
    }
    @Bean("shiroFilterFactoryBean")
    public ShiroFilterFactoryBean factoryBean(){
        ShiroFilterFactoryBean sffb=new ShiroFilterFactoryBean();
        //设置安全管理器
        sffb.setSecurityManager(securityManager());
        //*****设置没有登录时需要跳转的地址
        sffb.setLoginUrl("/sysUser/unlogin");
        //**********过滤器配置(过滤器的地址有很多需要配置,因此需要保证顺序)
        Map<String,String> map=new LinkedHashMap<>();
        /**
         * 一个地址可以执行多个过滤器
         * 常用的几个过滤器
         *    annon 允许匿名访问(不需要登录)
         *    user 需要登录才能访问(包含记住我)
         *    authc 需要登录(强制登录,本次登录是输入密码进入的,不包含记住我)
         *    logout 注销
         *    roles 必须满足指定的所有角色
         *    perms 必须满足指定的所有权限
         */
        //*****规则 不拦截的(放行的)放上面,拦截的放在下面
        map.put("/zhuxiao", "logout");
        //find地址表示不需要登录即可访问
        map.put("/product/find", "anon");
        //表示除了find以外的地址,都需要登录才行,相当于先执行前面再去执行后面
        map.put("/product/*", "user");
        sffb.setFilterChainDefinitionMap(map);
        //检测到没有权限时的跳转地址
//        sffb.setUnauthorizedUrl("");
        return sffb;
    }
    @Bean
    public MysqlRealm mysqlRealm(){
        MysqlRealm mysqlRealm=new MysqlRealm();
        //变动的地方: 配置加密管理器 登录时 会使用该加密方式对输入的密码进行加密,再和数据库的密码进行比对
        HashedCredentialsMatcher hsm = new HashedCredentialsMatcher();
        hsm.setHashAlgorithmName("sha-256");//加密方式 与注册时保持一致
        hsm.setHashIterations(100);//散列次数 与注册时保持一致
        mysqlRealm.setCredentialsMatcher(hsm);
        return mysqlRealm;
    }

}
2.4 测试
2.4.1 当访问localhost:8080时进入如下界面,此时页面显示未登录

在这里插入图片描述

2.4.2 当用户点击添加链接,进入登录界面并成功登录后,此时页面显示已登录和登录的用户名
a 点击添加链接后,进入登录界面

在这里插入图片描述

b 登录成功后进入如下所示的界面

在这里插入图片描述

2.4.3 点击注销按钮,会退回到默认访问界面(localhost:8080)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值