gpt4 book ai didi

spring - @Secured 注释有效,但带有 PermissionEvaluator 的 @PostAuthorize 无效

转载 作者:行者123 更新时间:2023-12-02 08:54:00 26 4
gpt4 key购买 nike

以下问题让我抓狂:

我有以下设置:

  • 接口(interface)StudyService
  • @Service StudyServiceImpl 实现 StudyService
  • @Controller StudyServiceController 实现 StudyService
  • SampleDAOImpl 实现 SampleDAO
  • 权限评估器 CdmPermissionEvaluator

我有以下代码:

class SampleDAOImpl implements SampleDAO {
...
@Secured(Roles.USER)
@PostAuthorize("hasPermission(returnObject, 'read')")
Sample load(long sampleId) {
...
}
...
}

@Secured 有效,因为我必须在存在时登录。但是,即使我注释掉@Secured,@PostAutorize 也不起作用。我在 CdmPermissionEvaluator.hasPermission() 中有一个日志记录语句,但它永远不会被记录。当我注释掉 @Secured 注释时也是这种情况(以避免由于默认的 AffirmativeBased 投票者而无法评估 @PostAuthorize)。

web.xml的相关部分:

...
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.rpc</url-pattern>
</servlet-mapping>
...

spring-servlet.xml的相关部分:

...
<security:global-method-security secured-annotations="enabled"/>
<context:annotation-config/>

<!-- Auto-detect controllers; these extend RemoteServiceServlet and are -->
<!-- annotated with @Controller -->
<context:component-scan base-package="org.gmeb.crf.server">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
...

applicationContext.xml的相关部分:

<context:annotation-config/>

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

<context:component-scan base-package="org.gmeb.crf">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

applicationContext-security.xml的相关部分:

<http auto-config="true" entry-point-ref="authenticationEntryPoint"
create-session="always" use-expressions="true">
<intercept-url pattern="/**" access="permitAll()"/>
<form-login authentication-success-handler-ref="authenticationSuccessHandler"
authentication-failure-handler-ref="authenticationFailureHandler"/>
<logout success-handler-ref="logoutSuccessHandler"/>
<anonymous/>
</http>
...
<global-method-security pre-post-annotations="enabled"> <!-- TODO: Add proxy-target-class="true" -->
<expression-handler ref="expressionHandler"/>
</global-method-security>

<beans:bean id="expressionHandler"
class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<beans:property name="permissionEvaluator" ref="cdmPermissionEvaluator"/>
</beans:bean>

<beans:bean id="loggerListener"
class="org.springframework.security.authentication.event.LoggerListener"/>

<context:annotation-config/>

<beans:bean id="cdmPermissionEvaluator" class="org.gmeb.crf.server.auth.CdmPermissionEvaluator">
</beans:bean>

知道我在这里做错了什么吗?

在进行此设置之前,我在 @Service StudyServiceImpl 中使用了带有 Spring EL 表达式(无permissionEvaluator)的 @PostAuthorize 注释,并且效果良好。那么我做错了什么,与之前的设置有什么区别?

提前致谢,

阿诺

最佳答案

这不起作用,因为您无法在单个方法上混合不同的注释类型而不得到奇怪的结果。因此,建议您对要保护的每个类或接口(interface)坚持使用单个“安全元数据”选项。

更详细地说,应用程序中可以使用多个不同的元数据源(安全注释、前置注释、切入点定义、JSR-250 注释)。它们通常都由 DelegatingMethodSecurityMetadataSource 处理。实例只会查询其委托(delegate)人,直到从其中之一得到具体答案为止。所以如果你有 @Secured@PreAuthorize为一个方法定义的,只会使用一个。

您应该只有一个 <global-method-security>您的应用程序中定义的元素。您只需要把它放在 -servlet.xml 中即可。上下文文件(如果您要将方法安全性应用到 Web Controller 或其中定义的其他 bean)。

关于spring - @Secured 注释有效,但带有 PermissionEvaluator 的 @PostAuthorize 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9067498/

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