【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


相关文章
|
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
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
271 6
|
4月前
|
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. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
339 4
|
4月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
302 1