任何人都可以深入了解@PreAuthorize 注释的工作原理吗?

吉欣MV

我知道 Spring Security 有一个抽象类SecurityExpressionRoot在我们有类似的方法hasAuthority(String var1)hasRole(String var1)等来实现。Spring 还提供了一个@PreAuthorize在方法级别使用注释,我们在该注释中传递单个值,如

@PreAuthorize("hasRole('ROLE_ABC')")

注释@interface就像

package org.springframework.security.access.prepost;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface PreAuthorize {
    String value();
}

我想知道此注释如何从SecurityExpressionRoot.

数据库

Spring security 使用面向方面的编程 ( AOP ) 将安全代码编织/交织到您自己的代码库中。这在 Spring 中的工作方式是使用定义注入点的注解 (cfr. pointcuts) 以允许在您自己的代码之前/之后/内执行额外的逻辑 (cfr. advice)。

Interceptors扫描您的代码库join points(即对于 Spring,当标有特定注释时,这始终是方法执行)并将根据您使用的拦截点(即接口)执行附加的特定逻辑。

要启用此行为,可以添加配置:

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)
public class ConfigGlobalMethodSecurity extends GlobalMethodSecurityConfiguration {
  ...
}

特别是对于PreAuthorizePrePostAdviceReactiveMethodInterceptor负责查找用 注释的方法PreAutorize反过来,这将委托给PreInvocationAuthorizationAdvice这里配置的ReactiveMethodSecurityConfiguration作为ExpressionBasedPreInvocationAdvice

这在内部使用默认表达式处理程序DefaultMethodSecurityExpressionHandler创建一个SecurityExpressionRoot. 这的实际实现SecurityExpressionRoot将定义如何PreAuthorize处理您的遗嘱中的表达式以及需要执行哪些逻辑。

SecurityExpressionRoot定义哪些表达式是让你内PreAuthorize,如hasRole

要添加额外的表达式或扩展默认权限逻辑,您需要提供一个自定义实现,SecurityExpressionRoot可选地自定义PermissionEvaluator. 例如,如果您想编写@PreAuthorize("hasKnowledgeOf('AOP')").

public class CustomMethodSecurityExpressionRoot
    extends SecurityExpressionRoot
    implements MethodSecurityExpressionOperations {

  private final PermissionEvaluator permissionEvaluator;
  private final Authentication authentication;

  private Object filterObject;
  private Object returnObject;
  private Object target;

  public CustomMethodSecurityExpressionRoot(
      Authentication authentication,
      PermissionEvaluator permissionEvaluator) {
    super(authentication);
    this.authentication = authentication;
    this.permissionEvaluator = permissionEvaluator;
    super.setPermissionEvaluator(permissionEvaluator);
  }

  // new expression to check if the requested knowledge is present
  public boolean hasKnowledgeOf(String context) {
    // provide logic that performs the check
  }

  @Override
  public void setFilterObject(Object filterObject) {
    this.filterObject = filterObject;
  }

  @Override
  public Object getFilterObject() {
    return filterObject;
  }

  @Override
  public void setReturnObject(Object returnObject) {
    this.returnObject = returnObject;
  }

  @Override
  public Object getReturnObject() {
    return returnObject;
  }

  @Override
  public Object getThis() {
    return target;
  }
}

@Configuration
public class CustomPermissionEvaluator
    implements PermissionEvaluator {

  @Override
  public boolean hasPermission(
      Authentication authentication,
      Object targetDomainObject,
      Object permission) {
    // define your custom permission logic here
  }

  @Override
  public boolean hasPermission(
      Authentication authentication,
      Serializable targetId,
      String targetType,
      Object permission) {
    // define your custom permission logic here
  }
}

完成配置并将评估器传递给表达式根。

public class CustomMethodSecurityExpressionHandler
    extends DefaultMethodSecurityExpressionHandler {

  PermissionEvaluator permissionEvaluator;

  public CustomMethodSecurityExpressionHandler(PermissionEvaluator permissionEvaluator) {
    this.permissionEvaluator = permissionEvaluator;
    super.setPermissionEvaluator(permissionEvaluator);
  }

  @Override
  protected MethodSecurityExpressionOperations createSecurityExpressionRoot(
      Authentication authentication,
      MethodInvocation invocation) {
    CustomMethodSecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(
        authentication,
        permissionEvaluator);
    root.setTrustResolver(new AuthenticationTrustResolverImpl());
    root.setRoleHierarchy(getRoleHierarchy());
    return root;
  }
}

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)
public class ConfigGlobalMethodSecurity extends GlobalMethodSecurityConfiguration {

  @Autowired CustomPermissionEvaluator permissionEvaluator;

  @Override
  protected MethodSecurityExpressionHandler createExpressionHandler() {
    return new CustomMethodSecurityExpressionHandler(permissionEvaluator);
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

任何人都可以更正此代码吗?

任何人都可以理解connStateInterface吗?

任何人都可以帮助解析HCL吗?

任何人都可以处理吗?

任何人都可以回答这个问题吗?

任何人都可以识别此表格以进行日期存储吗?

任何人都可以通过示例详细解释多态关联吗?

任何人都可以在Codecademy-Calendar App的Angular代码中发现错误吗?

任何人都可以提供REST API列表来查询elasticsearch吗?

任何人都可以对CURIE及其使用方法进行很好的解释吗?

Java中的捕获转换是什么,任何人都可以举个例子吗?

任何人都可以与Maven分享Cloud Foundry UAA回购吗?

任何人都可以帮助我通过 CSS 对齐图标吗?

任何人都可以在这段代码中解释我的打印语句吗?

任何人都可以用 Jsoup 刮一个元素吗?

任何人都可以抛出“ java.lang.InternalError”或“ java.lang.UnknownError”吗?

任何人都可以详细说明Number的精度并在JavaScript中溢出吗?

任何人都可以建议 jmeter 脚本录制除 blazemeter 以外的替代方案吗?

任何人都可以建议使用什么来使UI屏幕成为提及对象吗?

任何人都可以帮助我理解下面代码中的问题吗?

任何人都可以帮助 webapps 中的缓存过程吗?

任何人都可以帮助我进行 webpack 配置吗?

关于编写异步函数的特定混淆。任何人都可以验证吗?

关于pytorch张量的奇怪行为。任何人都可以解释清楚吗?

任何人都可以解释这种有关数组排序的奇怪行为吗?

任何人都可以为 C++ STL 做出贡献吗?

任何人都可以建议在Julia中纠正以下数组理解吗

任何人都可以帮助我进行以下 SQL 查询吗?

任何人都可以帮助我解决 Hibernate 和 JSF 的这个缺点吗?