【Shiro】第四章 Web项目集成Shiro(四)

简介: 【Shiro】第四章 Web项目集成Shiro(四)
【1.4】案例
【1.4.1】创建项目

拷贝shiro-day01-07web新建shiro-day01-08web-java

 

【1.4.2】修改shiro.ini

#声明自定义的realm,且为安全管理器指定realms

[main]

definitionRealm=com.itheima.shiro.realm.DefinitionRealm

securityManager.realms=$definitionRealm

#用户退出后跳转指定JSP页面

logout.redirectUrl=/login.jsp

#若没有登录,则被authc过滤器重定向到login.jsp页面

authc.loginUrl = /login.jsp

[urls]

/login=anon

#发送/home请求需要先登录

#/home= authc

#发送/order/list请求需要先登录

#/order-list = roles[admin]

#提交代码需要order:add权限

#/order-add = perms["order:add"]

#更新代码需要order:del权限

#/order-del = perms["order:del"]

#发送退出请求则用退出过滤器

/logout = logout

【1.4.3】登录相关

修改HomeServlet的doPost方法

1. package com.itheima.shiro.web;
2. 
3. import org.apache.shiro.SecurityUtils;
4. import org.apache.shiro.subject.Subject;
5. 
6. import javax.servlet.ServletException;
7. import javax.servlet.annotation.WebServlet;
8. import javax.servlet.http.HttpServlet;
9. import javax.servlet.http.HttpServletRequest;
10. import javax.servlet.http.HttpServletResponse;
11. import java.io.IOException;
12. 
13. /**
14.  * @Description:系统home页面
15.  */
16. @WebServlet(urlPatterns = "/home")
17. public class HomeServlet extends HttpServlet {
18. 
19. @Override
20. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
21. throws ServletException, IOException {
22.         doPost(req, resp);
23.     }
24. 
25. @Override
26. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
27. throws ServletException, IOException {
28. //通过subjectd对象去判断是否登录
29. Subject subject = SecurityUtils.getSubject();
30. boolean flag  = subject.isAuthenticated();
31. if (flag){
32.             resp.sendRedirect("home.jsp");
33.         }else {
34.             req.getRequestDispatcher("/login").forward(req, resp);
35.         }
36.     }
37. }

访问http://localhost:8080/platform/home 进行debug

 

此时我们通过subject.isAuthenticated()判断是否登录,如果登录则重定向到home.jsp,如果没有登录则转发到/login对应的servlet

【1.4.4】角色相关

修改OrderListServlet的doPost方法,判断是否有admin角色,如果有则转发order-list.jsp,没有则转发/login

1. package com.itheima.shiro.web;
2. 
3. import org.apache.shiro.SecurityUtils;
4. import org.apache.shiro.subject.Subject;
5. 
6. import javax.servlet.ServletException;
7. import javax.servlet.annotation.WebServlet;
8. import javax.servlet.http.HttpServlet;
9. import javax.servlet.http.HttpServletRequest;
10. import javax.servlet.http.HttpServletResponse;
11. import java.io.IOException;
12. 
13. /**
14.  * @Description:订单列表
15.  */
16. @WebServlet(urlPatterns = "/order-list")
17. public class OrderListServlet extends HttpServlet {
18. 
19. @Override
20. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
21. throws ServletException, IOException {
22.         doPost(req, resp);
23.     }
24. 
25. @Override
26. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
27. throws ServletException, IOException {
28. Subject subject = SecurityUtils.getSubject();
29. //判断当前角色
30. boolean flag = subject.hasRole("admin");
31. if (flag){
32.             req.getRequestDispatcher("order-list.jsp").forward(req, resp);
33.         }else {
34.             req.getRequestDispatcher("/login").forward(req, resp);
35.         }
36.     }
37. }

访问http://localhost:8080/platform/order-list

 

因为此时我未登录,也就是说当前没有admin角色,这是通过subject.hasRole("admin")返回未false

【1.4.5】资源相关

修改OrderAddServlet

1. package com.itheima.shiro.web;
2. 
3. import org.apache.shiro.SecurityUtils;
4. import org.apache.shiro.subject.Subject;
5. 
6. import javax.servlet.ServletException;
7. import javax.servlet.annotation.WebServlet;
8. import javax.servlet.http.HttpServlet;
9. import javax.servlet.http.HttpServletRequest;
10. import javax.servlet.http.HttpServletResponse;
11. import java.io.IOException;
12. 
13. /**
14.  * @Description:添加页码
15.  */
16. @WebServlet(urlPatterns = "/order-add")
17. public class OrderAddServlet extends HttpServlet {
18. 
19. @Override
20. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
21. throws ServletException, IOException {
22.         doPost(req, resp);
23.     }
24. 
25. @Override
26. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
27. throws ServletException, IOException {
28. Subject subject = SecurityUtils.getSubject();
29. //判断是否有对应资源
30. boolean flag = subject.isPermitted("order:add");
31. if (flag){
32.             req.getRequestDispatcher("order-add.jsp").forward(req, resp);
33.         }else {
34.             req.getRequestDispatcher("/login").forward(req, resp);
35.         }
36.     }
37. 
38. }

访问http://localhost:8080/platform/order-add

 

因为此时我未登录,也就是说当前没有order:add资源,通过 subject.isPermitted("order:add")返回未false

【2】基于Jsp标签

【2.1】使用方式

Shiro提供了一套JSP标签库来实现页面级的授权控制, 在使用Shiro标签库前,首先需要在JSP引入shiro标签:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>


【2.2】相关标签
标签 说明
< shiro:guest > 验证当前用户是否为“访客”,即未认证(包含未记住)的用户
< shiro:user > 认证通过或已记住的用户
< shiro:authenticated > 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在
< shiro:notAuthenticated > 未认证通过用户。与guest标签的区别是,该标签包含已记住用户
< shiro:principal /> 输出当前用户信息,通常为登录帐号信息
< shiro:hasRole name="角色"> 验证当前用户是否属于该角色
< shiro:lacksRole name="角色"> 与hasRole标签逻辑相反,当用户不属于该角色时验证通过
< shiro:hasAnyRoles name="a,b"> 验证当前用户是否属于以下任意一个角色
<shiro:hasPermission name=“资源”> 验证当前用户是否拥有制定权限
<shiro:lacksPermission name="资源"> 与permission标签逻辑相反,当前用户没有制定权限时,验证通过
【2.3】案例
【2.3.1】新建项目

拷贝shiro-day01-08web-java新建shiro-day01-09web-jsp-taglib项目

 

【2.3.2】修改home.jsp
1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2. <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
4. <html>
5. <head>
6.     <title></title>
7. </head>
8. <body>
9. <h6>
10.     <a href="${pageContext.request.contextPath}/logout">退出</a>
11.     <shiro:hasRole name="admin">
12.     <a href="${pageContext.request.contextPath}/order-list">列表</a>
13.     </shiro:hasRole>
14.     <shiro:hasPermission name="order:add">
15.     <a href="${pageContext.request.contextPath}/order-add">添加</a>
16.     </shiro:hasPermission>
17. </h6>
18. </body>
19. </html>

【2.3.3】测试

访问http://localhost:8080/platform/login

使用admin/123登录

 

这个时候我们只能看见“列表”,看不见“添加”,点击“退出”

使用jay/123登录

 

这个时候我们只能看见“添加”,看不见“列表”,点击“退出”

需要注意的是,这里只是页面是否显示内容,不能防止盗链的发生

相关文章
|
10月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
819 1
|
12月前
|
安全 Java 数据库
第16课:Spring Boot中集成 Shiro
第16课:Spring Boot中集成 Shiro
1178 0
|
11月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
1128 64
|
10月前
|
安全 Java 数据库
SpringSecurity认证授权及项目集成
本文介绍了基于Spring Security的权限管理框架,涵盖认证、授权与鉴权核心概念,通过快速入门示例演示集成流程,并结合数据库实现用户认证。进一步扩展实现正常登录,JWT登录及鉴权管理器,实现灵活的安全控制,适用于前后端分离项目中的权限设计与实践。
834 4
|
10月前
|
资源调度 JavaScript 前端开发
在Vue 3项目中集成Element Plus组件库的步骤
总结起来,在集成过程当中我们关注于库本身提供功能与特性、环境搭建与依赖管理、模块化编程思想以及前端工程化等方面知识点;同时也涵盖前端性能优化(比如上文提及“按需加载”)与定制化开发(例如“自定义主题”)等高级话题.
908 16
|
12月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
758 3
|
12月前
|
Java 关系型数据库 数据库连接
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
1064 2
|
12月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
1027 0
|
分布式计算 大数据 Java
springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
330 0
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
634 4