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";
}
}