Spring Boot学习篇
Posted SSS4362
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot学习篇相关的知识,希望对你有一定的参考价值。
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)
以上是关于Spring Boot学习篇的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 2从入门到入坟 | 基础入门篇:你会看Spring Boot的官方文档吗?
Spring Boot 2从入门到入坟 | 基础入门篇:你会看Spring Boot的官方文档吗?
spring boot框架学习3-spring boot核心
spring boot学习(十三)SpringBoot缓存(EhCache 2.x 篇)