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 篇)

spring Boot学习入门篇-idea开发简单的hello world实例

Spring Boot 2从入门到入坟 | Best practices篇:Spring Boot应用该如何编写?