spring security自定义决策管理器

下面来详细讲解一下“spring security自定义决策管理器”的完整攻略。

什么是决策管理器

Spring Security是一个基于Spring的安全框架,其中涉及到许多安全相关的处理,包括鉴权(Authentication)和授权(Authorization)等。使用Spring Security,我们可以通过配置来管理系统中不同的权限,而决策管理器(Access Decision Manager)则扮演着一个重要的角色。

决策管理器是Spring Security中的一个重要组件,它的作用是判断当前用户是否有访问某个资源的权限。如果有,就将请求发送给相应的handler进行处理;如果没有,则拒绝请求。

Spring Security 决策管理器的默认实现

Spring Security提供了三个决策管理器的默认实现:

  • AffirmativeBased,只要给定的权限中有一个被允许访问,就允许访问。
  • ConsensusBased,投票机制,根据是否平局及其它因素等细节来判断是否允许访问。
  • UnanimousBased,只有所有的都不反对,才允许访问。

Spring Security 自定义决策管理器的步骤

如果默认的决策管理器无法满足我们的要求,就需要自定义决策管理器。

1. 编写自定义的决策管理器

我们首先需要编写一个类来自定义决策管理器,这个类需要实现AccessDecisionManager接口,其中最重要的方法是decide方法,它决策是否允许访问。

public class MyAccessDecisionManager implements AccessDecisionManager {

    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)
            throws AccessDeniedException, InsufficientAuthenticationException {
        // 根据 authentication 和其他参数来判断是否有权限
        // 如果没有权限,抛出 AccessDeniedException
        // 否则,允许访问
    }

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

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

2. 在配置中指定自定义的决策管理器

接下来,在配置文件中声明使用我们自定义的决策管理器

<http>
    <intercept-url pattern="/admin/**" access="ADMIN" />
    <access-decision-manager ref="myAccessDecisionManager" />
</http>

<beans:bean id="myAccessDecisionManager" class="com.example.MyAccessDecisionManager" />

示例一

假设有管理员和普通用户,管理员可以访问所有路径,普通用户只能访问/user路径。我们可以使用代码实现这个效果。

public class MyAccessDecisionManager implements AccessDecisionManager {

    @Override
    public void decide(Authentication authentication, Object object,
            Collection<ConfigAttribute> configAttributes)
            throws AccessDeniedException, InsufficientAuthenticationException {
        for (ConfigAttribute configAttribute : configAttributes) {
            String needRole = configAttribute.getAttribute();
            for (GrantedAuthority grantedAuthority : authentication.getAuthorities()) {
                if (needRole.equals(grantedAuthority.getAuthority())) {
                    return;
                }
            }
        }
        throw new AccessDeniedException("没有权限访问!");
    }

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

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
}
<http>
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    <intercept-url pattern="/user/**" access="ROLE_USER" />
    <access-decision-manager ref="myAccessDecisionManager" />
</http>

<beans:bean id="myAccessDecisionManager" class="com.example.MyAccessDecisionManager" />

示例二

假设有四种角色,分别为管理员、超级管理员、普通用户和财务人员,他们的访问权限不一。管理员可以访问所有路径,超级管理员可以访问/user路径,普通用户可以访问/user路径中的所有子路径,财务人员可以访问/finance路径。我们可以使用代码实现这个效果。

public class MyAccessDecisionManager implements AccessDecisionManager {

    @Override
    public void decide(Authentication authentication, Object object,
            Collection<ConfigAttribute> configAttributes)
            throws AccessDeniedException, InsufficientAuthenticationException {
        for (ConfigAttribute configAttribute : configAttributes) {
            String needRole = configAttribute.getAttribute();
            for (GrantedAuthority grantedAuthority : authentication.getAuthorities()) {
                if (needRole.equals(grantedAuthority.getAuthority())) {
                    return;
                }
            }
        }
        throw new AccessDeniedException("没有权限访问!");
    }

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

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
}
<http>
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    <intercept-url pattern="/user/**" access="ROLE_USER,ROLE_ADMIN" />
    <intercept-url pattern="/user/detail/**" access="ROLE_USER,ROLE_ADMIN,SUPER_ADMIN" />
    <intercept-url pattern="/finance/**" access="ROLE_FINANCE" />
    <access-decision-manager ref="myAccessDecisionManager" />
</http>

<beans:bean id="myAccessDecisionManager" class="com.example.MyAccessDecisionManager" />

以上就是“spring security自定义决策管理器”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring security自定义决策管理器 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • jenkins安装及其配置笔记

    下面是详细讲解“Jenkins安装及其配置笔记”的完整攻略。 1. 安装Jenkins 1.1 环境准备 要安装Jenkins,首先需要确保满足以下环境要求: 安装了Java JDK 8或更高版本; 至少有1GB的可用内存; 至少有1GB的可用磁盘空间。 1.2 下载Jenkins 官网下载地址:https://jenkins.io/download/ 推荐…

    Java 2023年5月19日
    00
  • jsp页面中EL表达式被当成字符串处理不显示值问题的解决方法

    当jsp页面中的EL表达式被当成字符串处理时,通常是因为在表达式中未添加适当的标识符。这种情况下,jsp引擎将认为该表达式是一个字符串,而不是一个有效的EL表达式。 为了解决这个问题,我们需要为EL表达式添加正确的标识符,以确保jsp引擎正确地解释它们。 下面是解决此问题的两种方法。 方法一:使用${}标识符 ${}是一个有效的EL表达式标识符,它可以用来表…

    Java 2023年6月15日
    00
  • Springboot实现多数据源切换详情

    下面我将为您详细介绍Spring Boot实现多数据源切换的完整攻略,包括以下内容: 配置数据源 配置JdbcTemplate 配置JPA 配置事务管理器 实现多数据源切换 1. 配置数据源 Spring Boot默认采用HikariCP作为连接池,我们需要分别配置多个数据源并注入到Spring中。我们可以在application.properties文件中…

    Java 2023年5月20日
    00
  • 解析Java中如何获取Spring中配置的bean

    获取Spring中配置的bean可以使用Java中的注解和工具类等方式。 方法一:使用注解 可以使用Spring中的@Autowire注解和@Resource注解获取Spring中配置的bean,具体流程如下: 1.在Java类中使用@Autowire注解或@Resource注解声明属性;2.在Spring配置文件中配置bean;3.在Java类中使用属性即…

    Java 2023年5月19日
    00
  • JAVA各种OOM代码示例与解决方法

    “JAVA各种OOM代码示例与解决方法”攻略 什么是OOM OOM是”Out Of Memory”的缩写,意为内存用尽。Java程序中,如果申请内存超过了JVM所限制的最大内存,则会发生OOM异常。在Java程序中,由于内存泄漏或者分配内存过多导致的OOM异常较为常见。 OOM异常的种类 Java heap spaceJVM使用的java堆内存中没有多余的空…

    Java 2023年5月20日
    00
  • 详解Java中native关键字

    首先我们需要了解一下Java中native关键字的含义。 Native关键字 在Java中,native关键字被用来修饰一个方法,标记这个方法是用外部语言(如C或C++)实现的。通俗地说,native表示这个方法的实现不是在Java代码中,而是在外部的二进制库中。使用native可以让Java代码与外部代码(如C++)实现交互,为Java提供了更强大的功能。…

    Java 2023年5月26日
    00
  • Java文件操作类 File实现代码

    一、File类概述 在Java编程中,经常需要对文件进行操作,比如读写文件内容、创建或删除文件等。Java中提供了一个File类,能够完成文件的相关操作。 File类是用来表示一个文件或者目录(文件夹)的抽象路径名。在实际使用中需要注意,File对象表示的是在代码中的抽象概念,并不一定要对应实际存在的文件或目录。 在Java中使用File类时,需要先创建一个…

    Java 2023年5月20日
    00
  • java银行管理系统源码

    Java银行管理系统源码攻略 介绍 本文将介绍Java银行管理系统源码的详细攻略,包括安装、配置、使用等过程。Java银行管理系统是一款非常实用的软件,可以帮助用户管理银行账户、转账、存款、取款等操作。使用该系统可以大大提升工作效率和管理银行的准确性。本文将详细介绍该系统的安装和使用过程。 安装 Java银行管理系统源码需要在Java开发环境下进行安装和配置…

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