gpt4 book ai didi

spring - 使用@PreAuthorize Annotation 防止方法调用无异常

转载 作者:行者123 更新时间:2023-12-04 14:34:57 25 4
gpt4 key购买 nike

我们正在使用 Spring Security 3。我们有一个自定义实现 权限评估器 它具有这种复杂的算法,可以在应用程序的方法级别授予或拒绝访问权限。为此,我们添加一个 @PreAuthorize 我们想要保护的方法的注释(显然)。一切都很好。然而,我们正在寻找的行为是,如果 hasPermission 调用被拒绝,只需要跳过 protected 方法调用,而是每次发生 403 错误。

任何想法如何防止这种情况?

您可以在此处找到对问题的不同解释; AccessDeniedException handling during methodSecurityInterception

最佳答案

解决方法是使用自定义MethodSecurityInterceptor ,它调用 AccessDecisionManager (隐含地,bu 调用 super 的方法)并决定是否继续进行方法调用。

package com.myapp;

public class MyMethodSecurityInterceptor extends MethodSecurityInterceptor {

@Override
public Object invoke(MethodInvocation mi) throws Throwable {
Object result = null;
try {
InterceptorStatusToken token = super.beforeInvocation(mi);
} catch (AccessDeniedException e) {
// access denied - do not invoke the method and return null
return null;
}

// access granted - proceed with the method invocation
try {
result = mi.proceed();
} finally {
result = super.afterInvocation(token, result);
}

return result;
}
}

设置应用程序上下文有点棘手:因为您不能使用 <sec:global-mathod-security>在这种情况下,需要定义一个显式的 AOP 配置(并创建原始标签默认所做的大部分对应 bean 结构):
<aop:config>
<!-- Intercept all relevant methods -->
<aop:pointcut id="myMethods"
expression='execution(* com.myapp.myService+.*(..))'/>
<aop:advisor advice-ref="mySecurityInterceptor" pointcut-ref="myMethods"/>
</aop:config>

<!-- Configure custom security interceptor -->
<bean id="mySecurityInterceptor"
class="com.myapp.MyMethodSecurityInterceptor">
<property name="securityMetadataSource">
<bean class="org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource">
<constructor-arg>
<bean class="org.springframework.security.access.expression.method.ExpressionBasedAnnotationAttributeFactory">
<constructor-arg>
<bean class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"/>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</property>
<property name="validateConfigAttributes" value="false"/>
<property name="accessDecisionManager" ref="accessDecisionManager"/>
<property name="authenticationManager" ref="authenticationManager"/>
</bean>

<!-- Configure AccessDecisionManager -->
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<property name="decisionVoters">
<list>
<bean class="org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter">
<constructor-arg>
<bean class="org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice"/>
</constructor-arg>
</bean>
</list>
</property>
</bean>

<!-- Configure AuthenticationManager as you wish -->
<!-- ........................................... -->

关于spring - 使用@PreAuthorize Annotation 防止方法调用无异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4621394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com