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日

相关文章

  • EL表达式截取字符串的函数说明

    下面是关于EL表达式截取字符串的函数说明的完整攻略: EL表达式截取字符串的函数说明 在EL表达式中,有两个函数可以用来截取字符串:fn:substring()和fn:substringAfter()。下面我们来详细讲解一下这两个函数的用法和示例。 fn:substring() fn:substring()函数可以用来截取字符串中的一段子串,它的语法如下: …

    Java 2023年6月15日
    00
  • Java中@DateTimeFormat和@JsonFormat注解介绍

    当在Java中处理时间或日期数据时,我们常需要使用特定的格式将其转换成字符串或反向解析。而在Spring框架中,我们可以使用@DateTimeFormat和@JsonFormat两个注解来精细地控制时间和日期的格式化。下面将详细介绍这两个注解的使用方法和示例。 @DateTimeFormat注解介绍 1. 作用 @DateTimeFormat注解可以用于解析…

    Java 2023年5月20日
    00
  • Java web拦截器inteceptor原理及应用详解

    下面我将详细讲解“Java web拦截器inteceptor原理及应用详解”的完整攻略。 什么是拦截器interceptor? 在Java Web开发中,拦截器(Interceptor)又称为拦截器相当于Servlet开发中的过滤器(Filter),用于在业务处理之前或之后,进行一系列自定义的操作。拦截器与过滤器的主要区别在于,过滤器主要用于在请求到达ser…

    Java 2023年5月20日
    00
  • Kotlin编程基础语法编码规范

    Kotlin编程基础语法编码规范 1. 常见命名规范 在Kotlin语言中,标识符的命名规范如下: 包名使用小写字母: 包名应该全部使用小写字母,且不应该使用下划线或者其它特殊字符。 类名使用驼峰命名: 类名的首字母应该大写,驼峰命名,不使用下划线。 方法名使用小驼峰命名: 方法名的首字母应该小写,而后面的单词首字母应该大写。 常量名使用全大写字母: 常量名…

    Java 2023年6月1日
    00
  • 详解使用Spring Data repository进行数据层的访问问题

    一、介绍Spring Data Repository Spring Data Repository是一种非常常用的用于访问数据层的组件。在Spring Data Repository中,只需要定义一个接口,并在接口中声明好需要的方法,就可以实现自动化的数据访问。具体而言,Spring Data会通过接口方法的名称和参数来推测query的内容,从而自动生成对应…

    Java 2023年5月20日
    00
  • 基于springboot搭建的web系统架构的方法步骤

    下面详细讲解基于Spring Boot搭建Web系统架构的步骤: 1. 准备工作 在开始构建基于Spring Boot的Web系统之前,需要完成一些准备工作。这些包括:* 安装Java JDK* 安装Eclipse或IntelliJ IDEA等IDE* 安装Maven或Gradle等构建工具 安装完成后,我们就可以开始构建Web系统了。 2. 创建Sprin…

    Java 2023年5月19日
    00
  • Java实现的权重算法(按权重展现广告)

    Java实现的权重算法(按权重展现广告) 什么是按权重展现广告算法? 按权重展现广告算法是一种广告广泛应用的算法,主要用来按照指定的权重展现广告,以达到给高权重的广告更多展示的目的。简而言之,权重越高的广告展示的概率就越大。 如何实现按权重展现广告算法? 在Java中,我们可以使用以下三种方式实现按权重展现广告算法: 1. 使用Random类的nextInt…

    Java 2023年5月19日
    00
  • AngularJS实现的生成随机数与猜数字大小功能示例

    实现AngularJS生成随机数和猜数字大小功能的示例,需要遵循以下几个步骤: 步骤1:创建页面 创建一个HTML页面,并导入AngularJS库文件。在页面中创建两个按钮,分别用于生成随机数和猜测数字大小。同时,为了显示随机数和猜测结果,还需要添加两个文本框。 <!DOCTYPE html> <html ng-app> <he…

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