SpringMVC实现注解式权限验证的实例

针对“SpringMVC实现注解式权限验证的实例”的完整攻略,我们可以按照以下步骤进行:

1. 添加依赖

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

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring-security.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring-security.version}</version>
</dependency>

2. 配置Spring Security

在 SpringMVC 中配置 Spring Security,主要有以下步骤:

2.1 添加 Spring Security 配置

在 WEB-INF 文件夹下创建一个 spring-security.xml 配置文件,并添加以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:b="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/user/**" access="hasRole('ROLE_USER')"/>
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="admin" password="admin" authorities="ROLE_ADMIN,ROLE_USER"/>
                <user name="user" password="user" authorities="ROLE_USER"/>
            </user-service>
        </authentication-provider>
    </authentication-manager>

</b:beans>

这里的配置实现的是拦截 /admin/ 和 /user/ 两个 URL,只有拥有 ROLE_ADMIN 和 ROLE_USER 权限的用户才能访问 /admin/ 和 /user/

2.2 配置Spring Security过滤器

配置Spring Security过滤器,让其在Spring中有效地工作。在 SpringMVC 的配置文件 applicationContext.xml 中添加以下内容:

<bean id="delegatingFilterProxy" class="org.springframework.web.filter.DelegatingFilterProxy">
    <property name="targetBeanName" value="springSecurityFilterChain"/>
</bean>

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
    <security:filter-chain-map path-type="ant">
        <security:filter-chain pattern="/admin/**" filters="securityFilter"/>
        <security:filter-chain pattern="/user/**" filters="securityFilter"/>
    </security:filter-chain-map>
</bean>

<bean id="securityFilter" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
    <property name="authenticationManager" ref="authenticationManager"/>
    <property name="accessDecisionManager" ref="accessDecisionManager"/>
    <property name="securityMetadataSource">
        <security:expression-based-filter-invocation-security-metadata-source>
            <security:filter-attribute-expression>
                <security:attribute name="access" expression="@myAccessDecisionManager.decide(#this, request, response)"/>
            </security:filter-attribute-expression>
        </security:expression-based-filter-invocation-security-metadata-source>
    </property>
</bean>

<bean id="accessDecisionManager" class="com.example.myAccessDecisionManager"/>

这里配置的是使用 SpringSecurity 的过滤链,通过拦截的 URL 来配置权限管理过滤器,最后还一定需要一个访问决策管理器来处理权限决策。

3. 编写MyAccessDecisionManager

在 com.example 包下创建一个名为 MyAccessDecisionManager 的 Class,并实现 Spring Security 的 AccessDecisionManager 接口。可以像如下方式实现:

public class MyAccessDecisionManager implements AccessDecisionManager {

    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)
            throws AccessDeniedException, InsufficientAuthenticationException {
        HttpServletRequest request = ((FilterInvocation) object).getHttpRequest();
        HttpServletResponse response = ((FilterInvocation) object).getHttpResponse();

        // 获取需要的权限
        List<String> permissions = new ArrayList<>();
        for (ConfigAttribute configAttribute : configAttributes) {
            permissions.add(configAttribute.toString());
        }

        // 判断是否持有指定权限
        boolean isAuthorized = false;
        for (String permission : permissions) {
            if (authentication.getAuthorities().contains(new SimpleGrantedAuthority(permission))) {
                isAuthorized = true;
                break;
            }
        }

        if (isAuthorized) {
            return;
        } else {
            throw new AccessDeniedException("Access denied");
        }
    }

    @Override
    public boolean supports(ConfigAttribute attribute) {
        return true;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
}

这里通过重写 AccessDecisionManager 接口中的 decide 方法来实现权限判断,并在需要权限控制的方法上添加 @Secured 注解进行权限控制。

4. 添加权限验证的注解

在需要进行权限验证的方法上添加 @Secured 注解,示例代码如下:

@Controller
@RequestMapping("/admin")
public class AdminController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    @Secured("ROLE_ADMIN")
    public ModelAndView helloAdmin() {
        ModelAndView mav = new ModelAndView("admin/hello");
        mav.addObject("message", "Hello, Admin!");
        return mav;
    }
}

通过新增注解 @Secured,Spring Security 会读取方法上的注解和我们的配置文件,并在必要的时候进行权限验证。

以上就是“SpringMVC实现注解式权限验证的实例”的完整攻略,其中涉及到权限验证的配置、过滤器的配置以及需要进行权限控制的方法上添加 @Secured 注解等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC实现注解式权限验证的实例 - Python技术站

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

相关文章

  • 通过button将form表单的数据提交到action层的实例

    以下是通过button将form表单的数据提交到action层的攻略: 1. 编写HTML代码 首先,我们需要编写一个HTML表单,包含要提交的数据和一个提交按钮。例如: <form action="/submit" method="POST"> <label for="name"…

    Java 2023年6月15日
    00
  • SpringBoot 返回Json实体类属性大小写的解决

    针对“SpringBoot 返回Json实体类属性大小写的解决”,可以采用以下两种方式: 1.使用Jackson的配置 在SpringBoot中,通常会使用Jackson作为JSON序列化、反序列化的工具,所以我们可以使用Jackson的配置来解决大小写问题。 1.1 配置方式 使用Jackson的@JsonProperty注解,指定属性名,然后加上相应的配…

    Java 2023年5月26日
    00
  • 怎么运行用记事本写的java程序

    当我们使用记事本来编写Java程序时,需要注意一些细节,例如设置环境变量、保存文件格式、编译运行指令等等。下面是详细讲解如何在Windows操作系统中使用记事本运行Java程序的攻略: 环境变量配置 为了让操作系统知道我们的Java程序在哪里,我们需要设置Java环境变量。可以按照如下步骤进行设置: 在桌面上用鼠标右键点击“此电脑”图标,然后选择“属性”选项…

    Java 2023年5月19日
    00
  • 常见的 JVM 性能分析工具有哪些?

    以下是关于常见的 JVM 性能分析工具的完整使用攻略: 常见的 JVM 性能分析工具 JVM 性能分析工具是用来分析 Java 程序在 JVM 上的性能表现的工具。常见的 JVM 性能分析工具包括以下几种: 1. JConsole JConsole 是 JDK 自带的一款监控工具,可以监控 JVM 的内存、线程、类、CPU 等信息。通过 JConsole,可…

    Java 2023年5月12日
    00
  • Spring Boot 和 Spring 到底有啥区别你知道吗

    Spring是一个Java企业级应用框架,该框架在应用开发中蕴含了大量的设计模式和最佳实践,并提供了特性多样、功能强大的模块,帮助开发者更好地实现业务功能。而Spring Boot是在Spring基础上进一步简化了Spring的配置和使用,提供了一些约定大于配置的方式,让开发者专注于业务逻辑的实现,而非框架细节。 下面分别从以下几个方面详细讲解Spring和…

    Java 2023年5月15日
    00
  • 推荐一个可以提高生产力的在线游戏

    很久没推荐好玩的工具了,今天给家推荐一个非常有意思的游戏:Habitica Habitica除了是个游戏之外,居然还是一个生产力应用! 为什么说Habitica还是个生产力应用呢?因为它还可以帮助我们养成习惯! 通过Habitica,我们可以用它的每日目标和代办事项列表功能来跟踪和管理你的习惯 在完成任务之后,你可以以此来升级你的虚拟角色,同时解锁游戏中更多…

    Java 2023年4月25日
    00
  • JAVA多线程之方法 JOIN详解及实例代码

    JAVA多线程之方法 JOIN详解及实例代码 什么是JOIN方法? 在Java多线程中,Join方法是Thread类提供的一种方法。用于主线程等待子线程执行完毕后再执行,即实现主线程对于子线程的加入(join)操作。 JOIN方法的语法 在Java多线程中,join方法的语法如下: public final void join() throws Interr…

    Java 2023年5月18日
    00
  • Java的递归算法详解

    Java的递归算法详解 什么是递归算法? 递归算法是指在函数中调用自身实现的一种算法思想。使用递归可以大大简化代码实现,提高代码可读性和代码质量。 递归算法的特点 递归算法需要有边界条件(也称为递归结束条件),以避免无限循环调用自身而导致栈溢出等问题。 递归算法要求问题能够分解成与原问题同类型的子问题,且子问题的求解可以通过递归调用自身来实现。 递归算法在实…

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