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

简介: 【Shiro】第四章 Web项目集成Shiro

1、Web集成原理分析

【1】web集成的配置

还记得吗,以前我们在没有与WEB环境进行集成的时候,为了生成SecurityManager对象,是通过手动读取配置文件生成工厂对象,再通过工厂对象获取到SecurityManager的。就像下面代码展示的那样

1. /**
2.    * @Description 登录方法
3.    */
4. private Subject shiroLogin(String loginName,String password) {
5. //导入权限ini文件构建权限工厂
6.     Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
7. //工厂构建安全管理器
8. SecurityManager securityManager = factory.getInstance();
9. //使用SecurityUtils工具生效安全管理器
10.     SecurityUtils.setSecurityManager(securityManager);
11. //使用SecurityUtils工具获得主体
12. Subject subject = SecurityUtils.getSubject();
13. //构建账号token
14. UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginName, password);
15. //登录操作
16.     subject.login(usernamePasswordToken);
17. return subject;
18. }

不过,现在我们既然说要与WEB集成,那么首先要做的事情就是把我们的shiro.ini这个配置文件交付到WEB环境中,定义shiro.ini文件如下

1. #声明自定义的realm,且为安全管理器指定realms
2. [main]
3. definitionRealm=com.itheima.shiro.realm.DefinitionRealm
4. securityManager.realms=$definitionRealm
【1.1】新建项目

新建web项目shiro-day01-07web,其中realm、service、resources内容从shiro-day01-06authentication-realm中拷贝即可

【1.2】pom.xml配置
1. <?xml version="1.0" encoding="UTF-8"?>
2. 
3. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5. <modelVersion>4.0.0</modelVersion>
6. 
7. <groupId>com.itheima.shiro</groupId>
8. <artifactId>shiro-day01-07web</artifactId>
9. <version>1.0-SNAPSHOT</version>
10. <packaging>war</packaging>
11. 
12. <name>shiro-day01-07web Maven Webapp</name>
13. <!-- FIXME change it to the project's website -->
14. <url>http://www.example.com</url>
15. 
16. <dependencies>
17. 
18. <dependency>
19. <groupId>commons-logging</groupId>
20. <artifactId>commons-logging</artifactId>
21. <version>1.1.3</version>
22. </dependency>
23. 
24. <dependency>
25. <groupId>org.apache.shiro</groupId>
26. <artifactId>shiro-core</artifactId>
27. <version>1.3.2</version>
28. </dependency>
29. 
30. <dependency>
31. <groupId>org.apache.shiro</groupId>
32. <artifactId>shiro-web</artifactId>
33. <version>1.3.2</version>
34. </dependency>
35. 
36. <dependency>
37. <groupId>junit</groupId>
38. <artifactId>junit</artifactId>
39. <version>4.11</version>
40. </dependency>
41. 
42. </dependencies>
43. 
44. <build>
45. <plugins>
46. <!-- tomcat7插件,命令: mvn tomcat7:run -DskipTests -->
47. <plugin>
48. <groupId>org.apache.tomcat.maven</groupId>
49. <artifactId>tomcat7-maven-plugin</artifactId>
50. <version>2.2</version>
51. <configuration>
52. <uriEncoding>utf-8</uriEncoding>
53. <port>8080</port>
54. <path>/platform</path>
55. </configuration>
56. </plugin>
57. 
58. <!-- compiler插件, 设定JDK版本 -->
59. <plugin>
60. <groupId>org.apache.maven.plugins</groupId>
61. <artifactId>maven-compiler-plugin</artifactId>
62. <version>3.1</version>
63. <configuration>
64. <source>8</source>
65. <target>8</target>
66. <showWarnings>true</showWarnings>
67. </configuration>
68. </plugin>
69. </plugins>
70. </build>
71. </project>
【1.3】web.xml配置
1. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2. xmlns="http://java.sun.com/xml/ns/javaee"
3. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
4. version="3.0">
5. <display-name>shiro-day01-07web</display-name>
6. 
7. <!-- 初始化SecurityManager对象所需要的环境-->
8. <context-param>
9. <param-name>shiroEnvironmentClass</param-name>
10. <param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value>
11. </context-param>
12. 
13. <!-- 指定Shiro的配置文件的位置 -->
14. <context-param>
15. <param-name>shiroConfigLocations</param-name>
16. <param-value>classpath:shiro.ini</param-value>
17. </context-param>
18. 
19. <!-- 监听服务器启动时,创建shiro的web环境。
20.        即加载shiroEnvironmentClass变量指定的IniWebEnvironment类-->
21. <listener>
22. <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
23. </listener>
24. 
25. <!-- shiro的l过滤入口,过滤一切请求 -->
26. <filter>
27. <filter-name>shiroFilter</filter-name>
28. <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
29. </filter>
30. <filter-mapping>
31. <filter-name>shiroFilter</filter-name>
32. <!-- 过滤所有请求 -->
33. <url-pattern>/*</url-pattern>
34. </filter-mapping>
35. 
36. </web-app>

【2】SecurityManager对象创建

上面我们集成shiro到web项目了,下面我们来追踪下源码,看下SecurityManager对象是如何创建的

(1)我启动了服务器,监听器捕获到了服务器启动事件。我现在所处的位置EnvironmentLoaderListener监听器的入口处

(2)进入方法内查看,它先根据我们的shiroEnvironmentClass变量的值org.apache.shiro.web.env.IniWebEnvironment,初始化一个shiro环境对象

(3)最后在创建一个SecurityManager对象,再将其绑定到刚才通过字节码创建的Shiro环境对象中

到这来SecurityManager就完成了初始化

2、Shiro默认过滤器

Shiro内置了很多默认的过滤器,比如身份验证、授权等相关的。默认过滤器可以参考org.apache.shiro.web.filter.mgt.DefaultFilter中的枚举过滤器

【1】认证相关

过滤器 过滤器类 说明 默认
authc FormAuthenticationFilter 基于表单的过滤器;如“/**=authc”,如果没有登录会跳到相应的登录页面登录
logout LogoutFilter 退出过滤器,主要属性:redirectUrl:退出成功后重定向的地址,如“/logout=logout” /
anon AnonymousFilter 匿名过滤器,即不需要登录即可访问;一般用于静态资源过滤;示例“/static/**=anon”

【2】授权相关

过滤器 过滤器类 说明 默认
roles RolesAuthorizationFilter 角色授权拦截器,验证用户是否拥有所有角色;主要属性: loginUrl:登录页面地址(/login.jsp);unauthorizedUrl:未授权后重定向的地址;示例“/admin/**=roles[admin]”
perms PermissionsAuthorizationFilter 权限授权拦截器,验证用户是否拥有所有权限;属性和roles一样;示例“/user/**=perms["user:create"]”
port PortFilter 端口拦截器,主要属性:port(80):可以通过的端口;示例“/test= port[80]”,如果用户访问该页面是非80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样
rest HttpMethodPermissionFilter rest风格拦截器,自动根据请求方法构建权限字符串(GET=read, POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create)构建权限字符串;示例“/users=rest[user]”,会自动拼出“user:read,user:create,user:update,user:delete”权限字符串进行权限匹配(所有都得匹配,isPermittedAll)
ssl SslFilter SSL拦截器,只有请求协议是https才能通过;否则自动跳转会https端口(443);其他和port拦截器一样;

3、Web集成完整案例

基于shiro-day01-07web继续集成

【1】编写pom.xml

1. <?xml version="1.0" encoding="UTF-8"?>
2. 
3. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5. <modelVersion>4.0.0</modelVersion>
6. 
7. <groupId>com.itheima.shiro</groupId>
8. <artifactId>shiro-day01-07web</artifactId>
9. <version>1.0-SNAPSHOT</version>
10. <packaging>war</packaging>
11. 
12. <name>shiro-day01-07web Maven Webapp</name>
13. <!-- FIXME change it to the project's website -->
14. <url>http://www.example.com</url>
15. 
16. <dependencies>
17. 
18. <dependency>
19. <groupId>commons-logging</groupId>
20. <artifactId>commons-logging</artifactId>
21. <version>1.1.3</version>
22. </dependency>
23. 
24. <dependency>
25. <groupId>org.apache.shiro</groupId>
26. <artifactId>shiro-core</artifactId>
27. <version>1.3.2</version>
28. </dependency>
29. 
30. <dependency>
31. <groupId>org.apache.shiro</groupId>
32. <artifactId>shiro-web</artifactId>
33. <version>1.3.2</version>
34. </dependency>
35. 
36. <dependency>
37. <groupId>junit</groupId>
38. <artifactId>junit</artifactId>
39. <version>4.11</version>
40. </dependency>
41. 
42. <dependency>
43. <groupId>javax.servlet</groupId>
44. <artifactId>javax.servlet-api</artifactId>
45. <version>3.0.1</version>
46. <scope>provided</scope>
47. </dependency>
48. <dependency>
49. <groupId>jstl</groupId>
50. <artifactId>jstl</artifactId>
51. <version>1.2</version>
52. </dependency>
53. <dependency>
54. <groupId>taglibs</groupId>
55. <artifactId>standard</artifactId>
56. <version>1.1.2</version>
57. </dependency>
58. 
59. </dependencies>
60. 
61. <build>
62. <plugins>
63. <!-- tomcat7插件,命令: mvn tomcat7:run -DskipTests -->
64. <plugin>
65. <groupId>org.apache.tomcat.maven</groupId>
66. <artifactId>tomcat7-maven-plugin</artifactId>
67. <version>2.2</version>
68. <configuration>
69. <uriEncoding>utf-8</uriEncoding>
70. <port>8080</port>
71. <path>/platform</path>
72. </configuration>
73. </plugin>
74. 
75. <!-- compiler插件, 设定JDK版本 -->
76. <plugin>
77. <groupId>org.apache.maven.plugins</groupId>
78. <artifactId>maven-compiler-plugin</artifactId>
79. <version>3.1</version>
80. <configuration>
81. <source>8</source>
82. <target>8</target>
83. <showWarnings>true</showWarnings>
84. </configuration>
85. </plugin>
86. </plugins>
87. </build>
88. </project>

【2】编写shiro.ini文件

1. #声明自定义的realm,且为安全管理器指定realms
2. [main]
3. definitionRealm=com.itheima.shiro.realm.DefinitionRealm
4. securityManager.realms=$definitionRealm
5. #用户退出后跳转指定JSP页面
6. logout.redirectUrl=/login.jsp
7. #若没有登录,则被authc过滤器重定向到login.jsp页面
8. authc.loginUrl = /login.jsp
9. [urls]
10. /login=anon
11. #发送/home请求需要先登录
12. /home= authc
13. #发送/order/list请求需要先登录
14. /order-list = roles[admin]
15. #提交代码需要order:add权限
16. /order-add = perms["order:add"]
17. #更新代码需要order:del权限
18. /order-del = perms["order:del"]
19. #发送退出请求则用退出过滤器
20. /logout = logout


相关文章
|
1月前
|
JavaScript 前端开发
如何在项目中集成 Babel?
如何在项目中集成 Babel?
37 3
|
1月前
|
缓存 JSON 监控
如何在项目中保证 Web 组件化的性能
保证 Web 组件化的性能需要从多个方面入手,综合运用各种优化方法和策略。通过持续的优化和改进,能够提高组件化的整体性能,为用户提供更好的体验,同时也有助于提高项目的开发效率和质量。
42 8
|
1月前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
32 7
|
1月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
40 2
|
1月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
32 4
|
1月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
96 1
|
1月前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
49 5
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
169 3
|
23天前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
186 45