Spring 整合Shiro 并扩展使用EL表达式的实例详解

一、前言

在Web应用中,身份认证和权限控制是非常重要的组成部分,Shiro作为一个灵活的、功能强大的Java安全框架,在开发过程中可以方便地实现各种安全需求,因此被广泛应用于各种Java项目中。而Spring则作为一个非常流行的开发框架,与Shiro的整合可以解决现代Web应用中的常见安全问题。

本文将详细讲解如何在Spring项目中集成Shiro,并使用EL表达式扩展Shiro的功能,希望对想要学习Shiro或者正在开发使用Shiro的读者有所帮助。

二、整合Shiro

  1. 添加Shiro的Maven依赖

在pom.xml文件中添加以下依赖:

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-core</artifactId>
  <version>1.7.1</version>
</dependency>
<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-web</artifactId>
  <version>1.7.1</version>
</dependency>
  1. 配置Shiro的SecurityManager

在Spring的配置文件(如applicationContext.xml)中添加以下配置:

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  <!-- 设置自定义Realm,用于认证和授权 -->
  <property name="realm" ref="myRealm"/>
</bean>

其中myRealm是自定义的Realm类,需要继承org.apache.shiro.realm.Realm类,并实现其中的抽象方法doGetAuthenticationInfo和doGetAuthorizationInfo。

  1. 配置Shiro的FilterChain

在Spring的配置文件中添加以下配置:

<bean id="shiroFilter" class="org.apache.shiro.web.servlet.ShiroFilter">
  <property name="securityManager" ref="securityManager"/>
  <!-- 配置URL的访问规则和需要的权限 -->
  <property name="filterChainDefinitions">
    <value>
      /login.jsp = anon
      /logout = logout
      /** = authc
    </value>
  </property>
</bean>

其中,/login.jsp表示匿名访问的页面,/logout表示退出登录的操作,/**表示需要认证后才能访问的页面。

  1. 配置Shiro的DelegatingFilterProxy

在web.xml中添加以下配置:

<!-- Shiro Filter -->
<filter>
  <filter-name>shiroFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>shiroFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

至此,我们已经完成了Shiro与Spring的整合。在Shiro的基础上,我们可以继续扩展其功能。

三、扩展使用EL表达式

  1. 配置Spring的EL表达式支持

在Spring的配置文件中添加以下配置:

<bean id="defaultWebSecurityManager" parent="securityManager">
  <property name="subjectFactory">
    <bean class="org.apache.shiro.web.mgt.DefaultWebSubjectFactory">
      <!-- 使用Spring EL表达式来启用Session管理 -->
      <property name="sessionCreationEnabled" value="#{sessionManager.sessionValidationScheduler != null}"/>
    </bean>
  </property>
</bean>

其中,sessionManager是自定义的Session管理类,需要继承org.apache.shiro.web.session.mgt.DefaultWebSessionManager,并重写其getSessionId方法。

  1. 扩展Shiro的EL表达式

在Spring的配置文件中添加以下配置:

<bean id="shiroExpressionResolver" class="org.apache.shiro.spring.security.interceptor.SpringSecurityExpressionResolver"/>
<bean id="defaultFilterChainManager" class="org.apache.shiro.web.filter.mgt.DefaultFilterChainManager">
  <!-- 配置URL的访问规则和需要的权限,使用Spring EL表达式 -->
  <property name="filterChainDefinitionBuilder" ref="filterChainDefinitionBuilder"/>
</bean>
<bean id="filterChainDefinitionBuilder" class="org.apache.shiro.spring.web.config.DefaultFilterChainDefinitionBuilder">
  <property name="filterChainManager" ref="defaultFilterChainManager"/>
  <property name="resourcePathPrefix" value="/"/>
  <property name="definitions">
    <props>
      <prop key="/login.jsp">anon</prop>
      <prop key="/logout">logout</prop>
      <prop key="/**">authc && hasAnyRole('admin', 'user')</prop>
    </props>
  </property>
  <!-- 使用Spring EL表达式 -->
  <property name="expressionHandler">
    <bean class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
      <property name="permissionEvaluator">
        <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
          <property name="securityManager" ref="defaultWebSecurityManager"/>
          <property name="resourcePermissionResolver">
            <bean class="org.apache.shiro.spring.security.interceptor.SpringSecurityResourcePermissionResolver"/>
          </property>
        </bean>
      </property>
    </bean>
  </property>
</bean>

其中,我们配置了支持EL表达式的表达式解析器shiroExpressionResolver,并使用它来扩展filterChainDefinitionBuilder。在filterChainDefinitionBuilder中,我们使用了EL表达式来配置URL的访问规则和需要的权限,并使用Spring EL表达式的DefaultMethodSecurityExpressionHandler来解析EL表达式。

  1. 示例1:使用EL表达式进行用户权限判断

在jsp页面中,我们可以使用如下代码:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>首页</title>
</head>
<body>
  <h1>欢迎访问首页!</h1>
  <shiro:hasRole name="admin">
    <p>您是管理员,可以查看所有用户信息!</p>
  </shiro:hasRole>
  <shiro:lacksRole name="admin">
    <p>您不是管理员,无法查看所有用户信息!</p>
  </shiro:lacksRole>
</body>
</html>

其中,shiro:hasRole用于判断用户是否拥有指定的角色,shiro:lacksRole则用于判断用户是否不拥有指定的角色。

  1. 示例2:使用EL表达式进行资源权限判断

在jsp页面中,我们可以使用如下代码:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>用户信息</title>
</head>
<body>
  <h1>用户信息</h1>
  <table>
    <thead>
      <tr>
        <th>ID</th>
        <th>用户名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <shiro:forEach var="user" items="${users}">
        <tr>
          <td>${user.id}</td>
          <td>${user.username}</td>
          <td>${user.age}</td>
          <td>${user.gender}</td>
          <td>
            <shiro:hasPermission name="user:update:${user.id}">
              <a href="/user/${user.id}">编辑</a>
            </shiro:hasPermission>
            <shiro:lacksPermission name="user:update:${user.id}">
              无权限
            </shiro:lacksPermission>
          </td>
        </tr>
      </shiro:forEach>
    </tbody>
  </table>
</body>
</html>

其中,shiro:hasPermission用于判断用户是否拥有指定的资源权限,shiro:lacksPermission则用于判断用户是否不拥有指定的资源权限。

至此,我们已经完成了Shiro的整合和扩展使用EL表达式的示例。希望对读者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring 整合Shiro 并扩展使用EL表达式的实例详解 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 深入解析Java中ThreadLocal线程类的作用和用法

    深入解析 Java 中 ThreadLocal 线程类的作用和用法 什么是 ThreadLocal Java 中的 ThreadLocal 是一个线程级别的变量,它是一个简单的线程安全机制,可以用于解决多线程中的并发问题。通俗地说,ThreadLocal 就是一个存放数据的盒子,每个线程有一个专属的盒子,不同线程之间互不干扰。 ThreadLocal 的使用…

    Java 2023年5月20日
    00
  • JSP 自定义注解及记录操作日志

    下面是详细讲解“JSP 自定义注解及记录操作日志”的完整攻略: 什么是JSP自定义注解 注解是一种可插入到 Java 代码中的标记,这些标记可以在编译、运行时被读取,并执行特定的处理。在 JSP 中,可以使用注解添加自定义标记,可以让 JSP 页面更灵活、更易读、更易维护。 JSP自定义注解的使用方法 在 JSP 类中使用注解,需要先定义注解: @Reten…

    Java 2023年6月15日
    00
  • Apache Shiro 使用手册(三) Shiro授权

    Shiro授权是一个非常重要的部分,它定义了谁可以访问应用程序中的哪些资源。本文将介绍如何使用Shiro进行授权。 什么是Shiro授权? Shiro授权是指确定哪些用户可以访问应用程序中的哪些资源。一般来说,授权是在通过身份验证后给定的,如果身份验证已经将用户与特定角色相关联,则可以使用角色来进行授权。此外,还可以使用基于权限的授权方式。 Shiro授权处…

    Java 2023年6月15日
    00
  • SpringBoot整合Hibernate Validator实现参数验证功能

    下面我将详细讲解“SpringBoot整合Hibernate Validator实现参数验证功能”的完整攻略,过程中将包含两条示例。 什么是Hibernate Validator Hibernate Validator是一款Java Bean验证框架,它提供了一套丰富的注解,使用这些注解可以很方便地实现对Java Bean字段的验证。在一些Web开发中,我们…

    Java 2023年5月20日
    00
  • 让JPA的Query查询接口返回Map对象的方法

    要让JPA的Query查询接口返回Map对象,可以使用以下方法: 使用JPA自带的元模型(Metamodel)生成查询结果为Map的查询语句 通过Metamodel可以访问实体的属性,例如,对于一个名为User的实体,可以通过以下代码访问它的属性:User_.name 示例代码: CriteriaBuilder cb = entityManager.getC…

    Java 2023年5月20日
    00
  • java连接Oracle数据库的工具类

    下面是详细讲解 “Java连接Oracle数据库的工具类” 的完整攻略: 1. 准备工作 首先需要在本地或者服务器上安装Oracle数据库软件并成功启动,并在其上创建一个数据库实例,同时需要知道该实例的连接信息(IP地址、端口号、数据库名称、用户名、密码)。 然后需要在Java项目中引入Oracle JDBC驱动的jar包,例如ojdbc6.jar。 2. …

    Java 2023年5月20日
    00
  • Java Zip文件读写操作详解

    Java Zip文件读写操作详解 前言 Zip文件是一种常见的压缩文件格式,它可以有效地压缩多个文件,减小文件占用的存储空间。在Java开发中,也会经常用到Zip文件,因此掌握Java Zip文件读写操作是非常有必要的。 Zip文件读取操作 读取Zip文件可以使用Java中的ZipInputStream来实现。ZipInputStream可以将Zip文件中的…

    Java 2023年5月20日
    00
  • Sprint Boot @ConditionalOnMissingClass使用方法详解

    以下是关于Spring Boot中@ConditionalOnMissingClass的作用与使用方法的完整攻略,包含两个示例: @ConditionalOnMissingClass的作用 @ConditionalOnMissingClass是Spring Boot提供的一个条件注解,用于在类路径中不存在指定的类时才会生效。它可以用于控制Bean的创建和配置…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部