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

yizhihongxing

针对“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日

相关文章

  • 原生Ajax之全面了解xhr的概念与使用

    原生Ajax之全面了解xhr的概念与使用 什么是Ajax? Ajax是指使用JavaScript、XMLHttpRequest对象、DOM、CSS等技术在不刷新页面的情况下实现异步更新页面数据的一种技术。我们通常使用Ajax来实现动态加载数据、实时交互等功能。 XMLHttpRequest对象 XMLHttpRequest对象是Ajax的核心之一。它是浏览器…

    Java 2023年5月20日
    00
  • Spring Boot配置接口WebMvcConfigurer的实现

    下面是关于“Spring Boot配置接口WebMvcConfigurer的实现”的完整攻略,包含两个示例说明。 Spring Boot配置接口WebMvcConfigurer的实现 Spring Boot提供了许多配置选项来自定义应用程序的行为。其中,WebMvcConfigurer接口提供了许多配置选项来自定义Spring MVC的行为。本文将介绍如何实…

    Java 2023年5月17日
    00
  • Maven Repository仓库的具体使用

    Maven是Java项目中流行的构建工具,常用于自动化构建、依赖管理等操作。而Maven Repository(Maven仓库)则是Maven中可用依赖(dependency)和插件(plugin)的存储位置。在Maven项目中,需要使用某个依赖或插件时,Maven会去检查Repository中是否已经存在该资源,如果有则进行下载,否则会给出错误提示。本文将…

    Java 2023年6月2日
    00
  • Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办

    为了解决”Mybatis使用MySQL模糊查询时输入中文检索不到结果”的问题,我们需要在Mybatis配置文件中进行一些特定的设置。 1.在Mybatis的配置文件中添加如下代码: <configuration> <settings> <setting name="jdbcTypeForNull" value…

    Java 2023年6月1日
    00
  • Java异常处理运行时异常(RuntimeException)详解及实例

    Java异常处理运行时异常(RuntimeException)详解及实例 在 Java 中,运行时异常(RuntimeException)是指在代码运行期间抛出的异常,通常意味着代码中出现了某种错误,导致程序无法正常运行。本文将详细讲解 Java 运行时异常的概念、使用方法及实例。 什么是运行时异常? Java 中的运行时异常指在程序运行过程中被抛出的异常,…

    Java 2023年5月27日
    00
  • SpringBoot应用启动过程分析

    “SpringBoot应用启动过程分析”是一个比较深入的话题。在这里,我们将简单介绍一下SpringBoot应用的启动过程及它的主要特点和作用。下面,我们按照以下步骤讲解: SpringBoot应用的主要特点和作用 SpringBoot应用的启动流程 SpringBoot应用的启动过程分析 两条示例 总结 1. SpringBoot应用的主要特点和作用 Sp…

    Java 2023年5月15日
    00
  • java 枚举类定义静态valueOf(java.lang.String)方法的问题及解决

    我可以为你详细讲解“java 枚举类定义静态valueOf(java.lang.String)方法的问题及解决”的完整攻略。具体过程如下: 1. 问题描述 在Java枚举类中,通常会定义一个静态的 valueOf(java.lang.String) 方法,用于根据字符串值获取对应的枚举值。例如: public enum Color { RED, GREEN,…

    Java 2023年5月27日
    00
  • springboot集成springsecurity 使用OAUTH2做权限管理的教程

    Spring Boot是一个非常流行的Java开发框架,它可以帮助开发者快速构建Web应用程序。Spring Security是一个强大的安全框架,它可以帮助开发者实现身份验证、授权和安全管理。OAuth2是一种流行的授权协议,它可以帮助开发者实现安全的API访问和授权管理。以下是Spring Boot集成Spring Security使用OAuth2做权限…

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