【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登录

 

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

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

相关文章
|
1天前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
在现代Web开发领域,前后端分离已成为一种主流架构模式,它促进了开发效率、提升了应用的可维护性和可扩展性。随着实时数据交互需求的日益增长,WebSocket作为一种在单个长连接上进行全双工通讯的协议,成为了实现前后端实时通信的理想选择。在Python Web项目中,结合Flask框架与Flask-SocketIO库,我们可以轻松实现WebSocket的实时通信功能。
7 2
|
20天前
|
存储 NoSQL 数据处理
组合和继承怎么集成一个性能较好的项目
组合与继承是面向对象编程的核心概念,前者通过对象间关联实现高效解耦,后者则重用代码以节省空间和内存。组合常用于现代项目,利用代理与依赖注入简化代码管理;而继承简化了子模块对父模块资源的应用,但修改会影响整体。随着分层解耦及微服务架构如SpringCloud的出现,这些技术进一步优化了数据处理效率和服务响应性能,尤其在分布式存储与高并发场景下。同步异步调用、Redis分布式应用等也广泛运用组合与继承,实现代码和内存空间的有效复用。
|
27天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
65 0
|
27天前
|
开发者 Java 安全
Struts 2 实战秘籍:Action 驱动业务,配置文件成就高效开发!
【8月更文挑战第31天】Struts 2 框架作为 Apache 软件基金会的顶级项目,广泛应用于企业级 Web 应用开发。其核心组件 Action 类处理用户请求,而配置文件定义请求与 Action 类间的映射关系。掌握 Action 组件的最佳实践包括继承 `ActionSupport` 类、实现 `execute` 方法及使用类型安全的方法;配置文件的最佳实践则涉及组织 Action 到包中、定义全局结果及使用通配符映射。遵循这些最佳实践,可构建高效、可维护的 Web 应用程序。
30 0
|
27天前
|
Java 数据库连接 Spring
Struts 2 插件开发竟如魔法盛宴,为框架注入超能力,开启奇幻编程之旅!
【8月更文挑战第31天】在Web开发中,Struts 2插件开发允许我们在不改动框架核心代码的前提下,通过创建实现特定接口的Java类来扩展框架功能、调整其行为或促进与其他框架(如Spring、Hibernate)的集成,从而更好地满足特定业务需求。遵循良好的设计原则与实践,能够确保插件的高效稳定运行并提升整体项目的可维护性。具体步骤包括创建项目、定义插件类、实现初始化与销毁逻辑,并将插件部署至应用中。
45 0
|
27天前
|
前端开发 Java UED
告别页面刷新时代:Struts 2 Ajax技术揭秘,轻松实现动态加载,Web应用焕然一新!
【8月更文挑战第31天】在Web应用开发中,用户体验至关重要。为减少页面刷新带来的不适,Ajax技术应运而生。Struts 2作为流行的Java EE框架,通过内置的Ajax支持简化了无刷新页面动态加载的实现。本文通过对比传统请求响应模式,展示了Struts 2如何轻松实现Ajax功能,提升了用户体验和开发效率,并灵活地实现了数据交换。然而,使用Ajax时还需注意SEO和跨域请求等局限性。
32 0
|
27天前
|
Java 数据库连接 数据库
强强联手!JSF 与 Hibernate 打造高效数据访问层,让你的应用如虎添翼,性能飙升!
【8月更文挑战第31天】本文通过具体示例详细介绍了如何在 JavaServer Faces (JSF) 应用程序中集成 Hibernate,实现数据访问层的最佳实践。首先,创建一个 JSF 项目并在 Eclipse 中配置支持 JSF 的服务器版本。接着,添加 JSF 和 Hibernate 依赖,并配置数据库连接池和 Hibernate 配置文件。然后,定义实体类 `User` 和 DAO 类 `UserDAO` 处理数据库操作。
50 0
|
2月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
186 6
|
2月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
207 4
|
2月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
161 1