当前位置: 首页 > 知识库问答 >
问题:

Spring Security全局预授权规则

梁鸣
2023-03-14

我正在为网关后面的服务开发一种方法,以便于通信。

该计划使用oauth令牌中的作用域,该令牌将由运行在同一系统上的服务使用。

例如。如果oauth令牌具有作用域“acct”和“user”,bellow api方法将可用。如果ouath令牌的作用域为'admin',但缺少作用域'acct'和'user'中的一个或两个,则在不更改注释的情况下,我希望它也可用。

@PreAuthorize("#oauth2.hasScope('acct') and #oauth2.hasScope('user')")
@RequestMapping(value = "/scopedtest", produces = "application/json")
public Map<String, String> indexWithScope() {
    return getHashMapResult();
}

我希望这个'admin'范围被全球接受,这样服务开发人员就不需要在他们制作的每个api控制器上都包含admin范围,但仍然允许内部服务访问其他内部服务的api。

这将作为代码工作,它将拦截调用以预授权,并将响应更改为调用方被授权,如果它具有'admin'范围的话。如果oauth令牌具有预授权注释所需的作用域,调用将正常进行。

共有1个答案

刘承运
2023-03-14

第一步是创建一个自定义选民类

public class CustomVoter implements AccessDecisionVoter {

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

    @Override
    public int vote(Authentication authentication, Object object, Collection collection) {
        //Place your decision code here
        if( check_is_true() ) {
            //grant access
            return ACCESS_GRANTED;
        } else if ( check_is_false() ) {
            //deny access
            return ACCESS_DENIED;
        } else {
            //do not make a choice
            return ACCESS_ABSTAIN;
        }
    }

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

我们现在需要将该选民添加到将做出访问决定的选民列表中。

@Configuration
public class DecisionVotersConfiguration {

    @Autowired
    MethodInterceptor methodSecurityInterceptor;

    @PostConstruct
    @DependsOn("methodSecurityInterceptor")
    public void modifyAccessDecisionManager() {
        ((AffirmativeBased)((MethodSecurityInterceptor)methodSecurityInterceptor).getAccessDecisionManager()).getDecisionVoters().add(0, new CustomVoter());
    }
}

这将添加您的自定义决策投票人决策投票人列表。通过将其置于索引0,它将首先被检查。这将允许选民在以后的检查拒绝访问之前批准访问。这个配置类中的方法将取决于正在创建的methodSecurityInterceptor,它将具有决策投票者的初始列表。

 类似资料:
  • 我正在试图理解一些Spring Security代码。我也是Spring Security的新手,我想我在这里遗漏了一些基本的东西。 谢谢,雷。

  • 请求参数说明 参数 描述 必填 示例值 类型 最大长度 action 接口参数组 是 object └action 需要调用的接口名称 是 pre_thaw string get GET参数组,本组参数需要参与签名 是 object └biz_id 业务单号(biz_id与payid只传其一) 是 20191125001 number └amt 解冻金额(退款给客人金额,0或者空表示商家收取全部费

  • 如何配置和利用授权功能,然后使其全局可用于所有endpoint? 我的应用程序使用 HTTP 与承载方法进行保护。 Swagger UI身份验证的当前配置

  • EDIT做了一些更多的测试:当我只配置secure-annotations=“enabled”时,基于角色的安全性工作。此外,配置pre-postannotations=“enabled”时,既不安全也不预授权。当我只配置前-后注释时,它仍然不起作用。 编辑2 更多的测试:只有secured_annotations=“enabled”,对channelservice的调用通过Cglib2AopPr

  • 我正在尝试使用,我想将添加到我的像这样: 但下面的不起作用: 我的服务器是asp。net webApi。请帮忙,我该怎么办?

  • 我们使用Spring Security OAuth2保护我们的REST服务(用于服务器到服务器通信,不涉及用户)。但是,当您尝试访问浏览器中的受保护资源时,它将显示: 我们希望这是我们自己选择的自定义页面。有办法吗? 设置“拒绝访问”页面不起作用。首先,它需要定义一个登录页面,我们没有,因为这是一个纯服务器到服务器的通信。另一个原因是,这个属性自Spring 3.0..或类似的版本以来就被弃用了。