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

 

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

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

相关文章
|
4天前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
15 5
|
10天前
|
JavaScript 前端开发 数据安全/隐私保护
Web开发者必看:手把手教你如何轻松播放m3u8流地址,解锁视频播放新技能,让你的项目更上一层楼!
【10月更文挑战第23天】随着互联网技术的发展,m3u8格式因良好的兼容性和高压缩率被广泛用于网络流媒体传输。本文介绍如何在Web端播放m3u8流地址,包括引入视频播放器(如Video.js)、创建播放器容器、初始化播放器及播放m3u8流的具体步骤。此外,还涉及处理加密m3u8流的示例。
24 1
|
19天前
|
存储 JavaScript 数据库
ToB项目身份认证AD集成(一):基于目录的用户管理、LDAP和Active Directory简述
本文介绍了基于目录的用户管理及其在企业中的应用,重点解析了LDAP协议和Active Directory服务的概念、关系及差异。通过具体的账号密码认证时序图,展示了利用LDAP协议与AD域进行用户认证的过程。总结了目录服务在现代网络环境中的重要性,并预告了后续的深入文章。
|
18天前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
38 1
|
19天前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
19天前
|
安全 Java 测试技术
ToB项目身份认证AD集成(二):快速搞定window server 2003部署AD域服务并支持ssl
本文详细介绍了如何搭建本地AD域控测试环境,包括安装AD域服务、测试LDAP接口及配置LDAPS的过程。通过运行自签名证书生成脚本和手动部署证书,实现安全的SSL连接,适用于ToB项目的身份认证集成。文中还提供了相关系列文章链接,便于读者深入了解AD和LDAP的基础知识。
|
25天前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
100 0
|
1月前
|
Java Shell 开发工具
git集成IDEA,托管项目实现版本管理
git集成IDEA,托管项目实现版本管理
31 0
|
24天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
6天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
78 44