Spring Boot学习篇(十一)

Spring Boot学习篇(十一)

shiro安全框架使用篇(三)

1.shiro过滤地址配置(部分地址必须要登录才能访问)

1.1 在controll包下创建CRUDController类(用于提供地址进行测试),其内容如下所示
package com.zlz.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;

//①shiro过滤页面配置步骤一
@Controller
@RequestMapping("product")
public class CRUDController {
    @RequestMapping("find")
    public String find(HttpSession session){
        session.setAttribute("result", "商品查询");
        return "index";
    }
    @RequestMapping("delete")
    public String delete(HttpSession session){
        session.setAttribute("result", "商品删除");
        return "index";
    }
    @RequestMapping("update")
    public String update(HttpSession session){
        session.setAttribute("result", "商品删修改");
        return "index";
    }
    @RequestMapping("insert")
    public String insert(HttpSession session){
        session.setAttribute("result", "商品插入");
        return "index";
    }
}

1.2 变更ShiroConfig代码中的factoryBean方法
1.2.1 需要添加的代码如下所示
Map<String,String> map=new LinkedHashMap<>();
//配置规则 不拦截的(放行的)放上面,拦截的放在下面
//find地址表示不需要登录即可访问,注意这个map.put方法里面的第一个参数也可以是网页如/*.html这种
map.put("/product/find", "anon");
//表示除了find以外的地址,都需要登录才行,相当于先执行前面再去执行后面
map.put("/product/*", "user");
sffb.setFilterChainDefinitionMap(map);
1.2.2 factoryBean方法的完整代码配置如下所示
@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 必须满足指定的所有权限
         */
        //*****规则 不拦截的(放行的)放上面,拦截的放在下面
        //find地址表示不需要登录即可访问
        map.put("/product/find", "anon");
        //表示除了find以外的地址,都需要登录才行,相当于先执行前面再去执行后面
        map.put("/product/*", "user");
        sffb.setFilterChainDefinitionMap(map);
        //检测到没有权限时的跳转地址
//        sffb.setUnauthorizedUrl("");
        return sffb;
    }
1.3 变更SysUserController类
1.3.1 把User对象信息存储到session域中(模拟已登录)
SysUser users = sysUserMapper.findUserByUsername(username);
session.setAttribute("users", users);
1.3.2 增加未登录时的控制器方法
//设置需要登录,但没有登录的方法
 @RequestMapping("unlogin")
 public String unlogin(RedirectAttributes ra){
    ra.addFlashAttribute("msg","请先登录");
    return "redirect:/sysUser/tologin";
 }
1.3.3 增加跳转到登录界面的方法
@RequestMapping("tologin")
public String tologin(){
    return "login";
}

1.3.4 完整的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);
           //*************查到对象后把它放在session里面
           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";
    }

}
1.4 resources\templates目录下的两个页面文件
1.4.1 测试页面 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>
    <h3 th:if="${session.result!=null}" th:text="'访问结果:'+${session.result}"></h3>
    <a href="/product/find">查询商品</a>
    <a href="/product/insert">添加商品</a>
    <a href="/product/update">修改商品</a>
    <a href="/product/delete">删除商品</a>
</body>
</html>
1.4.2 没有用户权限时跳转的页面 login.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/sysUser/login" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <button type="submit">登录</button>
        <input type="hidden" name="">
    </form>
</body>
</html>
1.5 在controller包下创建WelcomeController类,用于配置默认页面(localhost:8080时显示的页面)
package com.zlz.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class WelcomeController {
    //默认访问localhost:8080进入的页面,一个斜杠代表进入你想要其进入的初始页面(默认页面的配置)
    @RequestMapping("/")
    public String welcome(){
        System.out.println("进入了没有");
        return "index";
    }
}
1.6 测试
1.6.1 查询页面
a 点击查询链接前

在这里插入图片描述

b 点击查询链接后

在这里插入图片描述

1.6.2 添加页面
a 点击添加链接前

在这里插入图片描述

b 点击添加链接后

在这里插入图片描述

1.6.3 修改页面
a 点击修改链接前

在这里插入图片描述

b 点击修改链接后

在这里插入图片描述

1.6.4 删除页面
a 点击删除链接前

在这里插入图片描述

b 点击删除链接后

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SSS4362

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

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

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

打赏作者

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

抵扣说明:

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

余额充值