【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月前
|
JavaScript 前端开发
如何在项目中集成 Babel?
如何在项目中集成 Babel?
34 3
|
23天前
|
缓存 JSON 监控
如何在项目中保证 Web 组件化的性能
保证 Web 组件化的性能需要从多个方面入手,综合运用各种优化方法和策略。通过持续的优化和改进,能够提高组件化的整体性能,为用户提供更好的体验,同时也有助于提高项目的开发效率和质量。
32 8
|
23天前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
27 7
|
27天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
36 2
|
29天前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
28 4
|
29天前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
70 1
|
1月前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
45 5
|
2月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
24天前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
47 0
|
5月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
316 6

热门文章

最新文章

下一篇
DataWorks